Как программно заполнить серийные номера в документе Сборка запасов в 1С:УНФ 3.0

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет
← На главную

При разработке расширений или автоматизации заполнения документов в конфигурации 1С:Управление нашей фирмой (УНФ) 3.0 программисты часто сталкиваются с проблемой: серийные номера в ТЧ отображаются текстом, но статус остается «красным», а движения по регистрам серий не формируются. Разберем подробно, почему так происходит и как правильно реализовать программное заполнение серийных номеров.

Анализируем структуру хранения серий в УНФ

Для начала проанализируем, как архитектурно устроено хранение серий в документах УНФ (например, в СборкаЗапасов, ПриходнаяНакладная или РасходнаяНакладная). В отличие от многих других конфигураций, здесь используется двухкомпонентная система:

  1. Табличная часть Запасы: Содержит реквизит СерииНоменклатуры с типом «Строка». Это поле является чисто декоративным — в нем через точку с запятой перечисляются наименования серий для удобства пользователя, и оно же определяет цвет значка статуса серий (заполнено/не заполнено).
  2. Табличная часть СерииНоменклатуры: Это скрытая или подчиненная табличная часть, в которой хранятся реальные ссылки на справочник СерииНоменклатуры. Именно на основании этой таблицы система строит движения по регистрам накопления.
  3. КлючСвязи: Это важнейший технический реквизит (число), который присутствует в обеих табличных частях. Он связывает конкретную строку из ТЧ Запасы с набором строк в ТЧ СерииНоменклатуры.

Выясним причину ошибки автора темы: он заполнял только строковое поле в основной таблице, игнорируя подчиненную ТЧ и механизм ключей связи. Рассмотрим, как исправить эту ситуацию.

Шаг 1: Подготовка Ключа связи

Прежде чем добавлять серии, мы должны убедиться, что у строки в таблице Запасы есть уникальный КлючСвязи. Если мы создаем строку программно, его нужно сгенерировать. Если строка уже существует, его нужно прочитать.

Рассмотрим пример генерации ключа, если он не заполнен:


Если СтрокаЗапасы.КлючСвязи = 0 Тогда
    // Обычно КлючСвязи — это индекс строки или максимальный ключ + 1
    МаксимальныйКлюч = 0;
    Для Каждого Стр Из Объект.Запасы Цикл
        МаксимальныйКлюч = Макс(МаксимальныйКлюч, Стр.КлючСвязи);
    КонецЦикла;
    СтрокаЗапасы.КлючСвязи = МаксимальныйКлюч + 1;
КонецЕсли;

Шаг 2: Заполнение подчиненной таблицы серий

Теперь разберем по шагам процесс переноса данных из документа-основания (например, ПеремещениеЗапасов) в новый документ. Нам необходимо не просто скопировать строку, а найти ссылку на объект серии и создать запись в технической таблице.

Посмотрим на пример кода, который решает эту задачу:


// Предположим, мы находимся в процедуре обработки заполнения
// Тек — это строка из документа-источника (ПеремещениеЗапасов.Запасы)

Если ЗначениеЗаполнено(Тек.СерииНоменклатуры) Тогда
    
    // 1. Находим соответствующую строку в новом документе (Сборка)
    Отбор = Новый Структура("Номенклатура", Тек.Номенклатура);
    НайденныеСтроки = Запасы.НайтиСтроки(Отбор);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        СтрокаЗапасыСборка = НайденныеСтроки[0];
        
        // 2. Устанавливаем текстовое представление (для UI)
        СтрокаЗапасыСборка.СерииНоменклатуры = Тек.СерииНоменклатуры;
        
        // 3. Разбиваем строку серий, если их несколько (через разделитель ";")
        СерииМассив = СтрРазделить(Тек.СерииНоменклатуры, ";");
        
        Для Каждого ИмяСерии Из СерииМассив Цикл
            ИмяСерии = СокрЛП(ИмяСерии);
            
            // 4. Добавляем запись в техническую ТЧ СерииНоменклатуры
            НоваяСтрокаСерии = СерииНоменклатуры.Добавить();
            НоваяСтрокаСерии.КлючСвязи = СтрокаЗапасыСборка.КлючСвязи;
            НоваяСтрокаСерии.Количество = 1; // Для серийных номеров всегда 1
            
            // Важно: Поиск серии по наименованию должен учитывать владельца (Номенклатуру)
            СерияСсылка = Справочники.СерииНоменклатуры.НайтиПоНаименованию(ИмяСерии, Истина, , СтрокаЗапасыСборка.Номенклатура);
            
            Если Не СерияСсылка.Пустая() Тогда
                НоваяСтрокаСерии.Серия = СерияСсылка;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЕсли;

Шаг 3: Обновление статусов и визуализации

Проанализируем ситуацию: даже если данные в таблицах есть, иконка серии может оставаться серой или красной до момента пересчета на форме. В типовых конфигурациях УНФ за это отвечают специальные процедуры в общих модулях.

Для корректной работы рекомендуется использовать методы модуля СерииНоменклатурыСервер (название может незначительно меняться в зависимости от версии 3.0.x). После программного изменения ТЧ на сервере, если вы работаете в контексте формы, желательно вызвать:

СерииНоменклатурыКлиентСервер.ОбновитьИндикаторыСерий(ЭтаФорма);

Важные нюансы и рекомендации

Поиск по наименованию: Как было отмечено в обсуждении, использование НайтиПоНаименованию без указания владельца — это плохая практика. У разных товаров могут быть одинаковые серийные номера. Всегда передавайте в поиск владельца (Номенклатура или КатегорияНоменклатуры в зависимости от настроек политики).

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

СерииНоменклатурыСервер.ИспользоватьСерииНоменклатуры(СтрокаЗапасов.Номенклатура)

Ключ связи и его уникальность: В УНФ 3.0 КлючСвязи должен быть уникальным в рамках всего документа. Если вы копируете строки из разных документов, следите, чтобы ключи не пересекались, иначе серии от одной строки «приклеятся» к другой.

Использование API УНФ: Вместо прямого перебора ТЧ, в современных версиях УНФ рекомендуется использовать структуру, которую возвращает метод СерииНоменклатурыСервер.ПолучитьСтруктуруСерийДокумента(ЭтотОбъект). Это позволяет работать с сериями более абстрактно и надежно.

Заключение

Мы рассмотрели механизм программного управления сериями. Основной секрет успеха заключается в синхронизации двух табличных частей через КлючСвязи. Помните, что поле СерииНоменклатуры в основной таблице — это всего лишь текстовая маска, а реальная работа происходит в подчиненной таблице, данные из которой попадают в регистры при проведении документа.

← На главную