Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
13 дек 2024, 07:37

Ошибка в передачи строк из подбора в заявку покупателя

Автор hr.al, 06 апр 2013, 12:27

0 Пользователей и 1 гость просматривают эту тему.

hr.al

Существует задача создать пересчет шт. в кв.м. (товар керамическая плитка) при помощи отдельного реквизита.

1. Был создан реквизит Sплитки в Спр. Единицы
2. Прописана функция:

Функция Sплитки1()
Если Номенклатура.Площадь = 0 Тогда
Возврат "";
Иначе
        Sплитки=Единица.Sплитки*Количество;
    Возврат строка(Sплитки);
КонецЕсли;
КонецФункции


3. Создана колонка в таблице документов: ЗаявкаПокупателя, ЗаказПоставщику, ПоступлениеТМЦ, Реализация.

и вроде все просто и хорошо, но....

появилась проблема, база начиная с 4 позиции не передает выбранное для последней позиции кол-во и цену из подбора в заявку, заявка как бы подвисает и после произвольного клика, последняя позиции остается незаполненной.

hr.al

Может это позволит сузить круг поиска ответа, я проверил, такая проблема возникает исключительно в заявке покупателя, ни в заказе поставщику, ни в поступлении тмц такой проблемы нет, хотя все везде прописано одинаково

Herby

Функция Sплитки1()  откуда и в какой момент вызывается?

SharZem

Цитата: hr.al от 06 апр 2013, 18:37
такая проблема возникает исключительно в заявке покупателя, ... хотя все везде прописано одинаково
Что-то берут сомнения :nhsrm:, Процедуру ОБработкаПодбора() этого документа не мешало бы переглядеть.

И почему строка(Sплитки), а не Число(Sплитки)?

hr.al

вот отдельный кусок где прописана функция Sплитки1:

////////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
//
//******************************************************************************
// ВыбратьВидОперации(СпособВыбора)
//
// Параметры:
//  СпособВыбора - вариат выбора для метода ВыбратьЗначение,
//                 необязательный параметр, по умолчанию - 1.
//
// Возвращаемое значение:
//  Возвращенное значение метода ВыбратьЗначение().
//
// Описание:
//  Служит для запроса у пользователя Вида операции документа
//
Функция ВыбратьВидОперации(СпособВыбора = 1)

// Спросим вид операции
СписокОпераций = СоздатьОбъект("СписокЗначений");   
                 
СписокОпераций.ДобавитьЗначение(Перечисление.ВидыОперацийЗаявок.Неподтвержденная);
СписокОпераций.ДобавитьЗначение(Перечисление.ВидыОперацийЗаявок.НаСклад);
СписокОпераций.ДобавитьЗначение(Перечисление.ВидыОперацийЗаявок.НаПоставку);

Возврат СписокОпераций.ВыбратьЗначение(ВидОперации,"Выбор вида операции",,60,СпособВыбора);
КонецФункции // ВыбратьВидОперации()



Функция вес1()

ВыбратьСтроки();вес=0;
Пока ПолучитьСтроку() = 1 Цикл
вес=вес+Единица.Вес*Количество;
КонецЦикла;
Возврат строка(вес)+" кг.";
КонецФункции // ВыбратьВидОперации()

Функция Sплитки1()
Если Единица.Sплитки = 0 Тогда
Возврат "";
Иначе
        Sплитки=Единица.Sплитки*Количество;
    Возврат строка(Sплитки);
КонецЕсли;
КонецФункции

//*****************************************************************************
// ТекстВалюты(Вал)
//
// Параметры:
//  Вал - элемент справочника "Валюты"
//
// Возвращаемое значение:
//  Строка валюты
//
// Описание:
// Возвращает название валюты или строку "<нет валюты>"
//
Функция ТекстВалюты(Вал)

Возврат ?(ПустоеЗначение(Вал) = 0, Вал.Наименование, "<нет валюты>");

КонецФункции


на всякий случай прикладываю полный код модуля

Herby

кодировка нечитаемая у файла.

надо смотреть обработкуПодбора(), и вы так и не ответили откуда вызывается Sплитки1()

hr.al

Цитата: Herby от 08 апр 2013, 10:50и вы так и не ответили откуда вызывается Sплитки1()

Вызывается она здесь... (см.ниже фото), а вот часть кода Процедура ОбработкаПодбора:

Добавлено: 08 апр 2013, 15:46


//******************************************************************************
// Предопределенная процедура
//
Процедура ОбработкаПодбора(ВыбЗнач, КонтФормыПодбора)

// есть ставки налогов, есть скидка
глОбработкаПодбора(Контекст, ВыбЗнач, 1, 1, 1);

КонецПроцедуры // ОбработкаПодбора()

Добавлено: 08 апр 2013, 17:29


это часть кода глОбработкаПодбора в глоб.модуле
//******************************************************************************
// глОбработкаПодбора(Конт, ВыбЗнач, ЕстьНДС, ЕстьНП, ЕстьСкидка)
//
// Параметры:
//  Конт       - контекст документа, в котором произошло событие "Обработка подбора"
// ВыбЗнач    - выбранное значение (список параметров)
//  ЕстьНДС    - нужно заполнять при подборе ставку и сумму НДС,
//  ЕстьНП     - нужно заполнять при подборе ставку и сумму НП,
//  ЕстьСкидка - нужно заполнять при подборе сумму скидки,
//
// Возвращаемое значение:
//  Нет
//
// Вызывается из формул элементов диалога:
//
// Описание:
//  Производит заполнение табличной части документа переданными из формы подбора
// данными.
//
Процедура глОбработкаПодбора(Конт, ВыбЗнач, ЕстьНДС, ЕстьНП, ЕстьСкидка)  Экспорт

Перем ТаблЧасть, ТаблицаПодбора;

ТипЗнач = ТипЗначенияСтр(ВыбЗнач);
Если ТипЗнач = "СписокЗначений" Тогда

ЕстьВидТМЦ   = ВыбЗнач.Получить("ЕстьВидТМЦ"); // нужно заполнять при подборе вид ТМЦ

ЦенаВподборе = ВыбЗнач.Получить("ЦенаВподборе");
Если (ЦенаВПодборе = "ИзСправочника") или (ЦенаВподборе = "Розница") Тогда
ЕстьЦена = 1; // нужно заполнять при подборе цену ТМЦ
Иначе

// (ЦенаВподборе = "Нет") или (ПустоеЗначение(ЦенаВподборе) = 1)
ЕстьЦена = 0;
КонецЕсли;
ТипЦен = ВыбЗнач.Получить("ТипЦен");

ТаблицаПодбора = ВыбЗнач.Получить("ТаблицаПодбора");
Иначе

// если не список ничего не делаем
Возврат;
КонецЕсли;

// Инициализация переменных
ФлагиИзТипаЦен = 1;
ЦенаВклНП      = 1;
ЦенаВклНДС     = 1;
    УчитыватьНП    = ЕстьНП;
    УчитыватьНДС   = ЕстьНДС;

Если ЕстьЦена = 1 Тогда
   
// Флаги включения налогов в сумму определяеются типом цен,
// кроме случая перемещения из розницы (цены в этом случае берутся из регистра с налогами)
Если ЦенаВподборе = "Розница" Тогда
ФлагиИзТипаЦен = 0;
КонецЕсли;

ФлагиИзТипаЦен = ФлагиИзТипаЦен * ?(ПустоеЗначение(ТипЦен) = 1, 0, 1);

Если ФлагиИзТипаЦен  = 1 Тогда

// Подбирали по ценам с налогами, заданными в типе цен
ЦенаВклНП  = ТипЦен.ЦенаВклНП;
ЦенаВклНДС = ТипЦен.ЦенаВклНДС;
Иначе // считаем, что подбирали в соответствии с флагами в документе

// По умолчанию считаем, что если нет в документе флагов учета налогов,
// то цена со всеми налогами (как в рознице)
Если глЕстьРеквизитШапки("СуммаВклНП", Конт.Вид()) = 1 Тогда
ЦенаВклНП   = Конт.СуммаВклНП;
КонецЕсли;

Если глЕстьРеквизитШапки("СуммаВклНДС", Конт.Вид()) = 1 Тогда
ЦенаВклНДС  = Конт.СуммаВклНДС;
КонецЕсли;
КонецЕсли;

// Выкручивать или накручивать налоги надо только если они в документе учитываются
Если глЕстьРеквизитШапки("УчитыватьНП", Конт.Вид()) = 1 Тогда
УчитыватьНП = ЕстьНП * Конт.УчитыватьНП;
КонецЕсли;

Если глЕстьРеквизитШапки("УчитыватьНДС", Конт.Вид()) = 1 Тогда
УчитыватьНДС = ЕстьНДС * Конт.УчитыватьНДС;
КонецЕсли;

КонецЕсли;

ТипЗнач = ТипЗначенияСтр(ТаблицаПодбора);
Если ТипЗнач = "ТаблицаЗначений" Тогда

РеквизитыТаблЧастиСтрока = "Единица, НомерСтроки";
Если (ЦенаВподборе = "Розница") И (глЕстьРеквизитМнЧ("Цена", Конт.Вид()) = 1) Тогда
РеквизитыТаблЧастиСтрока = РеквизитыТаблЧастиСтрока + ", Цена";
КонецЕсли;

Конт.ВыгрузитьТабличнуюЧасть(ТаблЧасть, РеквизитыТаблЧастиСтрока);

ТаблицаПодбора.ВыбратьСтроки();
Пока ТаблицаПодбора.ПолучитьСтроку() <> 0 Цикл
Номенклатура = ТаблицаПодбора.Номенклатура;
Единица = ТаблицаПодбора.Единица;

Если Номенклатура <> Единица.Владелец Тогда
    Сообщить("В подборе выбрана единица другого элемента справочника Номенклатура.
         |Проверьте правильность указания базовой и основной единицы для элемента
|""" + СокрЛП(Номенклатура) + """, а также правильность указания единиц измерения
|в справочниках единиц и цен для данной позиции номенклатуры." );
Продолжить;
КонецЕсли;

// ищем номенклатуру среди подобранных
Поз = 0;
Если (ЦенаВподборе = "Розница") И (глЕстьРеквизитМнЧ("Цена", Конт.Вид()) = 1) Тогда

// Для розницы ищем номенклатуру вместе с ценой
ТаблЧасть.ВыбратьСтроки();
Пока ТаблЧасть.ПолучитьСтроку() = 1 Цикл
    Если (ТаблЧасть.Цена = ТаблицаПодбора.Цена) И (ТаблЧасть.Единица = Единица) Тогда
    Поз = ТаблЧасть.НомерСтроки;
        Прервать;  // Нашли
    КонецЕсли;
КонецЦикла;
Иначе
    ТаблЧасть.НайтиЗначение(Единица, Поз, "Единица");
КонецЕсли;

Если Поз > 0 Тогда

// нашли, увеличиваем количество
Конт.ПолучитьСтрокуПоНомеру(Поз);
Конт.Количество = Конт.Количество + ТаблицаПодбора.Количество;

// Вызывать пересчет имеет смысл только если есть цена
Если ЕстьЦена = 1 Тогда
глПересчетТаблЧасти(Конт,"Количество");
КонецЕсли;
Иначе

// не нашли, добавляем новую строку
Конт.НоваяСтрока();
Если ЕстьВидТМЦ = 1 Тогда
Конт.ВидТМЦ = ТаблицаПодбора.ВидТМЦ;
КонецЕсли;

Конт.Номенклатура = Номенклатура;
Конт.Количество   = ТаблицаПодбора.Количество;
Конт.Единица      = Единица;
Конт.Коэффициент  = Единица.Коэффициент;   

Если ЕстьНДС = 1 Тогда
Конт.СтавкаНДС = Номенклатура.СтавкаНДС;
КонецЕсли;

Если ЕстьНП= 1 Тогда
Конт.СтавкаНП  = Номенклатура.СтавкаНП;
КонецЕсли;

Если глЕстьРеквизитМнЧ("РозничнаяНаценка",  Конт.Вид()) = 1 Тогда
Если Конт.РозничнаяНаценка = 0 Тогда
    // получим наценку из розничной цены
РознНаценка = 0;
глВернутьЦену(Номенклатура, Константа.РозничныйТипЦен, Конт.ДатаДок, , , , РознНаценка, );
Если РознНаценка = 0 Тогда
    Конт.РозничнаяНаценка = Константа.РозничныйТипЦен.Процент;
Иначе
Конт.РозничнаяНаценка = РознНаценка;
КонецЕсли;
КонецЕсли;
КонецЕсли;                                                                     

Если ЕстьЦена = 1 Тогда
глПересчитатьЦенуВДокументе(Конт, УчитыватьНП, УчитыватьНДС, ТаблицаПодбора.Цена, Конт.Валюта,
                            ЦенаВклНП, ЦенаВклНДС);
глПересчетТаблЧасти(Конт,"Цена");
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Конт.Форма.Обновить(0);
Конт.Активизировать("Количество");
Конт.АктивизироватьСтроку();

КонецПроцедуры // глОбработкаПодбора()

SharZem

Короче, Твоя Функция Sплитки1() к ошибкам при подборе не имеет никакого отношения.
Тебе нужно курить отладчик, потому-что возникает еще больше вопросов, Например:

Процедура ПоКнопкеПодбор()
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(Фирма,           "Фирма");
Параметры.ДобавитьЗначение(Склад,           "Склад");
Параметры.ДобавитьЗначение(0,               "ЕстьВидТМЦ");
Параметры.ДобавитьЗначение("ИзСправочника", "ЦенаВподборе");
Параметры.ДобавитьЗначение(ТипЦен,          "ТипЦен");
Параметры.ДобавитьЗначение(Валюта,          "Валюта");
Параметры.ДобавитьЗначение(Курс,            "Курс");

Если Выбран() = 0 Тогда
Параметры.ДобавитьЗначение("Дата",  "ТипГраницы");
Параметры.ДобавитьЗначение(ДатаДок, "ЗначениеГраницы");
Иначе
Параметры.ДобавитьЗначение("Позиция",         "ТипГраницы");
Параметры.ДобавитьЗначение(ПолучитьПозицию(), "ЗначениеГраницы");
КонецЕсли;

Параметры.ДобавитьЗначение("Подбор номенклатуры в документ " + ПредставлениеВида() + " № " + НомерДок, "Заголовок");
глПодбор(Контекст, Параметры);

КонецПроцедуры // ПоКнопкеПодбор()

Что такое глПодбор ???

В Процедура глОбработкаПодбора() есть условие

        Если (ЦенаВПодборе = "ИзСправочника") или (ЦенаВподборе = "Розница") Тогда
            ЕстьЦена = 1; // нужно заполнять при подборе цену ТМЦ
        Иначе
           
            // (ЦенаВподборе = "Нет") или (ПустоеЗначение(ЦенаВподборе) = 1)
            ЕстьЦена = 0;
        КонецЕсли;

Тогда почему в других документах цены заполняются ?
Прокуришь в отладчике - найдешь проблему ;)

hr.al

К сожалению я не специалист, просто любитель, отладчиком вообще не владею, а времени его изучить пока не будет... ((( может кто-то сможет помочь? цена вопроса? но конфу кинуть не смогу, может организуем процесс через TeamViewer например.

Herby

Цитата: hr.al от 10 апр 2013, 15:41(( может кто-то сможет помочь? цена вопроса? но конфу кинуть не смогу, может организуем процесс через TeamViewer например.

а в чем сложность отправить файл конфигурации? 

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск