При автоматизации бизнес-процессов в конфигурации 1С:Управление торговлей 11 программисты часто сталкиваются с необходимостью программного создания документов. Одной из наиболее трудоемких задач является корректное заполнение вариантов обеспечения (например, Отгрузить, Резервировать на складе, К обеспечению). В этой статье мы подробно разберем, почему стандартные методы могут выдавать ошибки и как правильно реализовать алгоритм заполнения на примере документа ЗаказНаСборку.
Рассмотрим ситуацию: вы создаете объект документа Заказ на сборку, заполняете его табличную часть Товары и пытаетесь вызвать стандартную функцию общего модуля ОбеспечениеСервер.ТаблицаЗаполнениеОбеспеченияДокумента. Внезапно система выдает ошибку: «Получение элемента по индексу для значения не определено» в недрах общего модуля.
Проанализируем причину. Внутренняя логика типового решения (УТ 11, ERP, КА) при расчете обеспечения опирается на текущие значения в строках табличной части. Если вы только что добавили строку программно, реквизит ВариантОбеспечения в ней имеет значение Неопределено или пустую ссылку. Алгоритм 1С пытается сопоставить текущий вариант с внутренней картой свойств, и, не находя значения, «вылетает» с ошибкой индексации.
Важный вывод: Перед тем как просить систему рассчитать или заполнить варианты обеспечения, мы должны инициализировать эти поля базовыми значениями.
Если ваша задача — жестко установить один и тот же вариант обеспечения для всех строк (например, вы точно знаете, что товар должен быть отгружен), можно воспользоваться простым перебором строк. Это самый быстрый способ, который не требует вызова сложных серверных процедур.
Давайте посмотрим на пример кода:
// Предположим, СборкаТовара — это созданный объект документа
Для каждого СтрокаТЧ Из СборкаТовара.Товары Цикл
// Устанавливаем вариант обеспечения напрямую из перечисления
СтрокаТЧ.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Отгрузить;
// Если требуется резервирование, можно использовать:
// СтрокаТЧ.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.РезервироватьНаСкладе;
КонецЦикла;
Однако у этого способа есть существенный минус: он игнорирует остатки на складах и настройки обеспечения. Если товара на складе нет, а вы установили Отгрузить, документ может просто не провериться, если в системе включен контроль остатков. Для интерактивной корректировки таких строк подойдёт инструмент для управления вариантами обеспечения и резервами в заказах.
Рассмотрим более сложный, но «правильный» с точки зрения архитектуры 1С алгоритм. Он позволяет системе самой решить, какую часть товара можно отгрузить, а какую нужно поставить в резерв или заказать.
Разберем процесс по шагам:
Требуется).Рассмотрим пример реализации:
// 1. Инициализируем строки
Для каждого СтрокаТЧ Из СборкаТовара.Товары Цикл
СтрокаТЧ.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Требуется;
КонецЦикла;
// 2. Формируем структуры для модуля обеспечения
МассивВариантов = Новый Массив;
МассивВариантов.Добавить(Перечисления.ВариантыОбеспечения.Отгрузить);
МассивВариантов.Добавить(Перечисления.ВариантыОбеспечения.РезервироватьНаСкладе);
ПутиКДанным = Новый Соответствие();
// Для Заказа на сборку датой отгрузки считается начало сборки
ПутиКДанным.Вставить("ДатаОтгрузки", "НачалоСборкиРазборки");
ПутиКДанным.Вставить("Склад", "Склад");
ПараметрыЗаполнения = Новый Структура("ИмяТабличнойЧасти", "Товары");
ПараметрыЗаполнения.Вставить("ПутиКДанным", ПутиКДанным);
ПараметрыЗаполнения.Вставить("МенеджерРегистра", РегистрыНакопления.ЗаказыНаСборку);
// 3. Вызываем серверный метод
ТаблицаОбеспечения = ОбеспечениеСервер.ТаблицаЗаполнениеОбеспеченияДокумента(
СборкаТовара,
МассивВариантов,
ПараметрыЗаполнения
);
// 4. Заполняем документ полученными данными
// В менеджерах многих документов есть процедура ЗаполнитьВариантОбеспечения
Документы.ЗаказНаСборку.ЗаполнитьВариантОбеспечения(СборкаТовара, ТаблицаОбеспечения);
Выясним, на что стоит обратить внимание именно в этом документе. В отличие от ЗаказаКлиента, в ЗаказеНаСборку реквизит даты отгрузки часто называется НачалоСборкиРазборки. Если вы ошибетесь в написании этого ключа в структуре ПутиКДанным, система не сможет правильно рассчитать остатки на конкретную дату.
Также важно помнить про обособленное обеспечение. Если в вашей компании используется работа под назначение (под конкретный заказ), убедитесь, что в параметрах заполнения передается корректное Назначение. В противном случае расчет будет вестись по общим остаткам склада, и вы можете «отобрать» товар у другого резерва.
Проанализируем ситуацию: в заказе 10 штук товара. На складе есть только 4 штуки. При правильном программном заполнении через ОбеспечениеСервер система должна разбить одну строку документа на две:
Отгрузить.К обеспечению.Именно поэтому использование метода ЗаполнитьВариантОбеспечения из менеджера документа предпочтительнее ручного перебора. Он берет на себя всю логику по добавлению новых строк и копированию аналитики (номенклатура, характеристики, серии).
Подводя итог, можно составить краткий чек-лист для успешного заполнения обеспечения:
Товары реквизит ВариантОбеспечения не равен Неопределено.ОбеспечениеСервер для расчета и менеджер документа для записи результатов.ПараметрыУказанияСерий, иначе расчет может пропустить позиции, требующие указания серийного номера.Соблюдение этих правил гарантирует, что ваш программно созданный документ будет вести себя в системе так же корректно, как если бы его создал опытный пользователь вручную через форму документа. При необходимости можно использовать готовую обработку для формирования заказов на сборку с учетом остатков комплектующих.