В типовых конфигурациях на базе 1С:ERP и 1С:Комплексная автоматизация механизм работы с сериями товаров жестко стандартизирован. При разработке собственного документа, содержащего номенклатуру с серийным учетом, разработчики часто сталкиваются с ошибками вида Переменная не определена (ПараметрыУказанияСерий) или исключениями при открытии обработки подбора серий: Предусмотрено открытие обработки только из документов.
Разберем по шагам, как устроена подсистема учета серий и как правильно встроить функционал подбора и регистрации серий номенклатуры в произвольный документ.
Проанализируем, почему типовая форма подбора серий не открывается простым вызовом:
РегистрацияИПодборСерийПоОднойСтрокеТоваров) требуют адрес во временном хранилище. Метод НоменклатураСервер.ПараметрыФормыУказанияСерий подготавливает структуру данных строки документа, помещает ее во временное хранилище и передает адрес в параметры формы.ПараметрыУказанияСерий не является глобальной переменной или встроенной функцией модуля формы. Это реквизит формы произвольного типа, который должен быть создан на форме документа и инициализирован при чтении объекта на сервере.Перед написанием программного кода проверим состав реквизитов табличной части нашего документа (например, ТЧ Товары):
СправочникСсылка.Номенклатура.СправочникСсылка.ХарактеристикиНоменклатуры.СправочникСсылка.СерииНоменклатуры.Число (отражает состояние: не требуется, требуется указать, заполнено).В модуле менеджера самописного документа необходимо объявить две обязательные экспортные функции, которые запрашиваются общими модулями подсистемы серий:
Функция ИменаРеквизитовДляЗаполненияПараметровУказанияСерий() Экспорт
// Перечисляем через запятую реквизиты шапки документа, влияющие на политику учета серий
ИменаРеквизитов = "Подразделение,Склад,Дата";
Возврат ИменаРеквизитов;
КонецФункции
Функция ПараметрыУказанияСерий(Объект) Экспорт
ПараметрыУказанияСерий = НоменклатураКлиентСервер.ПараметрыУказанияСерий();
ПараметрыУказанияСерий.ПолноеИмяОбъекта = "Документ.СамописныйДокумент";
ПараметрыУказанияСерий.ИмяТЧТовары = "Товары";
ПараметрыУказанияСерий.ИмяТЧСерии = "Товары";
// Если на складе включен учет серий
ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатурыСклад", Новый Структура("Склад", Объект.Склад));
ПараметрыУказанияСерий.Дата = Объект.Дата;
ПараметрыУказанияСерий.РегистрироватьСерии = Истина;
Возврат ПараметрыУказанияСерий;
КонецФункции
Перейдем в форму документа и выполним следующие действия:
ПараметрыУказанияСерий (тип: Произвольный).ПриЧтенииНаСервере выполним инициализацию структуры параметров:
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Инициализация фиксированной структуры для работы механизма указания серий
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(
НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.СамописныйДокумент)
);
// Расчет статусов серий для строк табличной части
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект, "Товары");
КонецПроцедуры
Также инициализацию необходимо продублировать в событии ПриСозданииНаСервере для новых (еще не записанных) документов.
В модуле формы документа вызов формы подбора серий для текущей строки таблицы реализуется следующим образом:
&НаКлиенте
Процедура ТоварыУказатьСерии(Команда)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = ПолучитьПараметрыФормыУказанияСерий(ТекущаяСтрока.ПолучитьИдентификатор());
Если ПараметрыФормы <> Неопределено Тогда
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыУказанияСерий", ЭтотОбъект);
ОткрытьФорму("Обработка.РегистрацияИПодборСерийПоОднойСтрокеТоваров.Форма.Форма", ПараметрыФормы, ЭтотОбъект,,,, ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьПараметрыФормыУказанияСерий(ИдентификаторСтроки)
Возврат НоменклатураСервер.ПараметрыФормыУказанияСерий(
Объект,
ПараметрыУказанияСерий,
ИдентификаторСтроки,
ЭтаФорма
);
КонецФункции
После закрытия формы подбора выполняется обработка результата и обновление статуса указания серий в строке документа через вызов клиентских процедур модуля НоменклатураКлиент.