Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
25 сен 2021, 00:31

ЗаполнитьПоСериям программно

Автор MikhailK, 26 авг 2021, 15:03

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

MikhailK

Добрый день ! В конфигурации УПП 1.3.31.1, в обработке создаю документ программно ТребованиеНакладную ,
СписокПодразделений = ТаблицаТоваров.Скопировать();

СписокПодразделений.Свернуть("РабочийЦентр,Подразделение");

Для Каждого ТекСтр из СписокПодразделений цикл
НовыйДокумент = Документы.ТребованиеНакладная.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = ДанныеСтроки.Ссылка.ЗаказНаПроизводство.Организация;
НовыйДокумент.ОтражатьВУправленческомУчете = Истина;
НовыйДокумент.Подразделение = ТекСтр.Подразделение;
НовыйДокумент.Склад = Склад;
НовыйДокумент.ЗаданиеНаВыпуск = ЗаданиеНаВыпуск;
НовыйДокумент.Смена = Смена.Смена;
НовыйДокумент.ДокументСмены = Смена;
пр = ДанныеСтроки.Ссылка.ЗаказНаПроизводство.Продукция[0];
НовыйДокумент.ЗаказНаПроизводство = ДанныеСтроки.Ссылка.ЗаказНаПроизводство;
НовыйДокумент.ПродукцияВыпуска = пр.Номенклатура;
НовыйДокумент.Характеристика= пр.ХарактеристикаНоменклатуры;
НовыйДокумент.ЗаданиеНаВыпуск  = ЗаданиеНаВыпуск;
НовыйДокумент.РабочийЦентр = ТекСтр.РабочийЦентр;
НовыйДокумент.НачальникСмены = НачальникСмены;
НовыйДокумент.Ответственный = ПараметрыСеанса.ТекущийПользователь;

Для Каждого строкаТовар из ТаблицаТоваров цикл
//Если строкаТовар.Подразделение <> ТекСтр.ПОдразделение тогда
Если строкаТовар.РабочийЦентр <> ТекСтр.РабочийЦентр тогда
Продолжить;
КонецЕсли;
Если строкаТовар.КСписанию = 0   тогда
Продолжить;
КонецЕсли;

НоваяСтрока = НовыйДокумент.Материалы.Добавить();
НоваяСтрока.Номенклатура = строкаТовар.Номенклатура;
НоваяСтрока.ХарактеристикаНоменклатуры = строкаТовар.Характеристика;
НоваяСтрока.Количество = строкаТовар.КСписанию;
НоваяСтрока.ЕдиницаИзмерения = строкаТовар.Ед;
НоваяСтрока.Заказ = ДанныеСтроки.Ссылка.ЗаказНаПроизводство;
НоваяСтрока.Коэффициент = строкаТовар.Ед.Коэффициент;
НоваяСтрока.Склад = Склад;
НоваяСтрока.СтатьяЗатрат =строкаТовар.СтатьиЗатрат;
НоваяСтрока.Качество = Справочники.Качество.Новый;
КОнецЦИкла;

Если НовыйДокумент.Материалы.Количество()>0 тогда
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);

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

Процедура ЗаполнитьПоСериям()

МатериалыТабличнойЧасти = Материалы.Выгрузить();
МатериалыТабличнойЧасти.Свернуть("Номенклатура");
СкладыТабличнойЧасти = Материалы.Выгрузить();
СкладыТабличнойЧасти.Свернуть("Склад");

МассивНоменклатуры   = МатериалыТабличнойЧасти.ВыгрузитьКолонку("Номенклатура");
МассивСклады         = СкладыТабличнойЧасти.ВыгрузитьКолонку("Склад");

ТаблицаРезервовПоСериям = новый ТаблицаЗначений;
ТаблицаСерий         = УправлениеЗапасами.ПолучитьТаблицуОстатковПоСериям(МассивСклады, Организация, МассивНоменклатуры,,,ТаблицаРезервовПоСериям);
МатериалыТабличнойЧасти = Материалы.Выгрузить();
Материалы.Очистить();

КолонкиТабЧасти = МатериалыТабличнойЧасти.Колонки;
    ИспользоватьУказаниеСерийНоменклатурыПриРезервировании = глЗначениеПеременной("ИспользоватьУказаниеСерийНоменклатурыПриРезервировании");

Для Каждого ИсходнаяСтрока ИЗ МатериалыТабличнойЧасти Цикл

СтуктураПоиска = Новый Структура;
СтуктураПоиска.Вставить("Номенклатура",               ИсходнаяСтрока.Номенклатура);
СтуктураПоиска.Вставить("ХарактеристикаНоменклатуры", ИсходнаяСтрока.ХарактеристикаНоменклатуры);
СтуктураПоиска.Вставить("Качество",                   ИсходнаяСтрока.Качество);
СтуктураПоиска.Вставить("Склад",                      ИсходнаяСтрока.Склад);

флЗаполнятьИзРезервов = ложь;
Если ТипЗнч(ИсходнаяСтрока.ЗаказРезерв)=Тип("ДокументСсылка.ЗаказПокупателя") И ИспользоватьУказаниеСерийНоменклатурыПриРезервировании Тогда
Если ИсходнаяСтрока.ЗаказРезерв.ДоговорКонтрагента.ОбособленныйУчетТоваровПоЗаказамПокупателей Тогда
СтуктураПоиска.Вставить("ДокументРезерва",    ИсходнаяСтрока.ЗаказРезерв);
флЗаполнятьИзРезервов = истина;
КонецЕсли;
КонецЕсли;
Если флЗаполнятьИзРезервов Тогда
НайденныеСтроки  = ТаблицаРезервовПоСериям.НайтиСтроки(СтуктураПоиска);
Иначе
НайденныеСтроки  = ТаблицаСерий.НайтиСтроки(СтуктураПоиска);
КонецЕсли;

КоличествоОсталосьПогасить = ИсходнаяСтрока.Количество;
        СтрокаСПустойСерией = Неопределено;

Для Каждого Строка Из НайденныеСтроки Цикл

Если КоличествоОсталосьПогасить <=0 Тогда
Прервать;
КонецЕсли;
            Если НЕ ЗначениеЗаполнено(Строка.СерияНоменклатуры) Тогда
Продолжить;
КонецЕсли;

ОстатокВЕдиницахДокумента = Строка.Остаток * ИсходнаяСтрока.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ИсходнаяСтрока.ЕдиницаИзмерения.Коэффициент;

Если ОстатокВЕдиницахДокумента >= КоличествоОсталосьПогасить Тогда
КоэффСписания = КоличествоОсталосьПогасить / ОстатокВЕдиницахДокумента;
Иначе
КоэффСписания = 1
КонецЕсли;

СписанноеКоличество = Окр(ОстатокВЕдиницахДокумента * КоэффСписания, 3, РежимОкругления.Окр15как20);
Если СписанноеКоличество = 0 Тогда
Продолжить;
КонецЕсли;

НоваяСтрока = Материалы.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, ИсходнаяСтрока);

НоваяСтрока.СерияНоменклатуры = Строка.СерияНоменклатуры;
НоваяСтрока.Количество        = СписанноеКоличество;
ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(НоваяСтрока, ЭтотОбъект);

Если НЕ ЗначениеЗаполнено(НоваяСтрока.СерияНоменклатуры) Тогда
СтрокаСПустойСерией = НоваяСтрока;
КонецЕсли;

КоличествоОсталосьПогасить = КоличествоОсталосьПогасить-СписанноеКоличество;
Строка.Остаток             = Строка.Остаток - СписанноеКоличество;

КонецЦикла;

Если КоличествоОсталосьПогасить > 0 Тогда

Если СтрокаСПустойСерией = Неопределено Тогда

НоваяСтрока = Материалы.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ИсходнаяСтрока);

НоваяСтрока.Количество = КоличествоОсталосьПогасить;
ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(НоваяСтрока, ЭтотОбъект);

Иначе

СтрокаСПустойСерией.Количество = СтрокаСПустойСерией.Количество+КоличествоОсталосьПогасить;

КонецЕсли;
КонецЕсли;

КонецЦикла;

КонецПроцедуры //ЗаполнитьПоСериям()

LexaK

а вы где эту процедуру расположили? где вызываете?

ну вроде как одно тонкое место в глаза бросается, что в Остатках с сериями?

вот в этих таблицах что-то есть?
ТаблицаРезервовПоСериям, ТаблицаСерий?

что в попадает/отбирается в НайденныеСтроки  их этого кода
        Если флЗаполнятьИзРезервов Тогда
            НайденныеСтроки  = ТаблицаРезервовПоСериям.НайтиСтроки(СтуктураПоиска);
        Иначе
            НайденныеСтроки  = ТаблицаСерий.НайтиСтроки(СтуктураПоиска);
        КонецЕсли;

под отладчиком надо запустить, все сразу станет ясно! ясно?
ответ Понравился? (в смысле пригодился?)

MikhailK

@LexaK, не могу в принципе прикрутить процедуру в момент создания требования накладной

Если НовыйДокумент.Материалы.Количество()>0 тогда
            Попытка
                НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);
         ЗаполнитьПоСериям();  //Ставлю сюда        !!!!
                Если Печатать тогда
                    НовыйДокумент.Печать("Накладная");
                КонецЕсли;
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;

Ругается что не заданы переменные
PS Сама процедура ЗаполнитьПоСериям(); рабочая она используется уже в созданных документах, отдельной кнопкой заполнить и провести , а вот как ее запихать в процедуру создания требования накладной не могу разобраться

LexaK

ааа,

попробуйте так
........
        Если НовыйДокумент.Материалы.Количество()>0 тогда
            Попытка
          ЗаполнитьПоСериям(НовыйДокумент); //перед записью дозаполнить Серии
  НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);
                   
                Если Печатать тогда
                    НовыйДокумент.Печать("Накладная");
                КонецЕсли;
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
КонецЦикла;

КонецПроцедуры

Процедура ЗаполнитьПоСериям(ДокОбъект)

    МатериалыТабличнойЧасти = ДокОбъект.Материалы.Выгрузить();
    МатериалыТабличнойЧасти.Свернуть("Номенклатура");
    СкладыТабличнойЧасти = ДокОбъект.Материалы.Выгрузить();
    СкладыТабличнойЧасти.Свернуть("Склад");

    МассивНоменклатуры   = МатериалыТабличнойЧасти.ВыгрузитьКолонку("Номенклатура");
    МассивСклады         = СкладыТабличнойЧасти.ВыгрузитьКолонку("Склад");
   
    ТаблицаРезервовПоСериям = новый ТаблицаЗначений;
    ТаблицаСерий         = УправлениеЗапасами.ПолучитьТаблицуОстатковПоСериям(МассивСклады, Организация, МассивНоменклатуры,,,ТаблицаРезервовПоСериям);
    МатериалыТабличнойЧасти = ДокОбъект.Материалы.Выгрузить();
    ДокОбъект.Материалы.Очистить();

    КолонкиТабЧасти = МатериалыТабличнойЧасти.Колонки;
    ИспользоватьУказаниеСерийНоменклатурыПриРезервировании = глЗначениеПеременной("ИспользоватьУказаниеСерийНоменклатурыПриРезервировании");

    Для Каждого ИсходнаяСтрока ИЗ МатериалыТабличнойЧасти Цикл

        СтуктураПоиска = Новый Структура;
        СтуктураПоиска.Вставить("Номенклатура",               ИсходнаяСтрока.Номенклатура);
        СтуктураПоиска.Вставить("ХарактеристикаНоменклатуры", ИсходнаяСтрока.ХарактеристикаНоменклатуры);
        СтуктураПоиска.Вставить("Качество",                   ИсходнаяСтрока.Качество);
        СтуктураПоиска.Вставить("Склад",                      ИсходнаяСтрока.Склад);

        флЗаполнятьИзРезервов = ложь;
        Если ТипЗнч(ИсходнаяСтрока.ЗаказРезерв)=Тип("ДокументСсылка.ЗаказПокупателя") И ИспользоватьУказаниеСерийНоменклатурыПриРезервировании Тогда
            Если ИсходнаяСтрока.ЗаказРезерв.ДоговорКонтрагента.ОбособленныйУчетТоваровПоЗаказамПокупателей Тогда
                СтуктураПоиска.Вставить("ДокументРезерва",    ИсходнаяСтрока.ЗаказРезерв);
                флЗаполнятьИзРезервов = истина;
            КонецЕсли;
        КонецЕсли;
        Если флЗаполнятьИзРезервов Тогда
            НайденныеСтроки  = ТаблицаРезервовПоСериям.НайтиСтроки(СтуктураПоиска);
        Иначе
            НайденныеСтроки  = ТаблицаСерий.НайтиСтроки(СтуктураПоиска);
        КонецЕсли;

        КоличествоОсталосьПогасить = ИсходнаяСтрока.Количество;
        СтрокаСПустойСерией = Неопределено;

        Для Каждого Строка Из НайденныеСтроки Цикл

            Если КоличествоОсталосьПогасить <=0 Тогда
                Прервать;
            КонецЕсли;
            Если НЕ ЗначениеЗаполнено(Строка.СерияНоменклатуры) Тогда
                Продолжить;
            КонецЕсли;

            ОстатокВЕдиницахДокумента = Строка.Остаток * ИсходнаяСтрока.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ИсходнаяСтрока.ЕдиницаИзмерения.Коэффициент;

            Если ОстатокВЕдиницахДокумента >= КоличествоОсталосьПогасить Тогда
                КоэффСписания = КоличествоОсталосьПогасить / ОстатокВЕдиницахДокумента;
            Иначе
                КоэффСписания = 1
            КонецЕсли;

            СписанноеКоличество = Окр(ОстатокВЕдиницахДокумента * КоэффСписания, 3, РежимОкругления.Окр15как20);
            Если СписанноеКоличество = 0 Тогда
                Продолжить;
            КонецЕсли;

            НоваяСтрока = ДокОбъект.Материалы.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, ИсходнаяСтрока);
           
            НоваяСтрока.СерияНоменклатуры = Строка.СерияНоменклатуры;
            НоваяСтрока.Количество        = СписанноеКоличество;
            ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(НоваяСтрока, ЭтотОбъект);

            Если НЕ ЗначениеЗаполнено(НоваяСтрока.СерияНоменклатуры) Тогда
                СтрокаСПустойСерией = НоваяСтрока;
            КонецЕсли;

            КоличествоОсталосьПогасить = КоличествоОсталосьПогасить-СписанноеКоличество;
            Строка.Остаток             = Строка.Остаток - СписанноеКоличество;

        КонецЦикла;

        Если КоличествоОсталосьПогасить > 0 Тогда

            Если СтрокаСПустойСерией = Неопределено Тогда

                НоваяСтрока = ДокОбъект.Материалы.Добавить();
                ЗаполнитьЗначенияСвойств(НоваяСтрока, ИсходнаяСтрока);

                НоваяСтрока.Количество = КоличествоОсталосьПогасить;
                ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(НоваяСтрока, ЭтотОбъект);

            Иначе

                СтрокаСПустойСерией.Количество = СтрокаСПустойСерией.Количество+КоличествоОсталосьПогасить;

            КонецЕсли;
        КонецЕсли;

    КонецЦикла;

КонецПроцедуры //ЗаполнитьПоСериям()

ответ Понравился? (в смысле пригодился?)

MikhailK

@LexaK, теперь странный глюк получаю сообщение
ЦитироватьУправленческий учет. Документ Требование-накладная 00000005830 от 26.08.2021 18:05:03, табличная часть "Товары"
Не списано по партиям 1 шт. товара

но и из документа если жму кнопку заполнить провести , та же ошибка ??? не понимаю что не так

В процессе анализа понял что, что то в перемещениях , так как с другого склада все списывается как надо и серия ставиться

LexaK

@MikhailK,
Цитироватьтеперь странный глюк получаю сообщение

это не глюк, это у вас косяки в партионном учете!  :xfbnsdfb:
надо исправлять, (а ни кто не говорил, что будет легко)
ответ Понравился? (в смысле пригодился?)

Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск