Как заполнить приходный ордер на товары по документу перемещения в 1С?

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

При работе в конфигурациях 1С:Предприятие 8 прошлых поколений (таких как Управление торговым предприятием (УТП), Управление производственным предприятием (УПП 1.3), Управление торговлей (УТ 10.3) или Комплексная автоматизация (КА 1.1)) пользователи часто сталкиваются с неочевидным поведением интерфейса обычных форм. Типичный сценарий: кладовщик создает новый документ Приходный ордер на товары, вручную выбирает вид операции Перемещение, указывает склад-получатель, а при попытке заполнить табличную часть через кнопку Заполнить сталкивается с тем, что программа предлагает варианты только для работы с поставщиками (например, «по заказу поставщика» или «по счету поставщика»).

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

Выясняем причину: почему кнопка «Заполнить» не работает для перемещений?

Для того чтобы понять логику программы, обратимся к архитектуре обычных форм в решениях 1С. Кнопка Заполнить над табличной частью товаров инициализируется динамически при открытии формы документа. За это отвечает специализированный программный код.

Давайте проанализируем процедуру инициализации кнопок заполнения табличной части:


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

Эта процедура выполняется один раз при открытии формы. Механизм динамического построения меню анализирует текущие реквизиты документа. Поскольку по умолчанию новый документ создается с операцией «От поставщика», дерево кнопок формируется исключительно под этот сценарий.

Когда пользователь интерактивно меняет на форме вид операции на Перемещение, обработчик смены операции не инициирует повторный вызов перерисовки меню заполнения. Более того, в типовом коде этих конфигураций в принципе отсутствует встроенный алгоритм интерактивного заполнения ордера по перемещению прямо из формы созданного документа. Разработчики фирмы 1С изначально заложили другую логику бизнес-процесса.

---

Решение №1: Использование штатного механизма «Ввод на основании»

Самый простой и правильный способ заполнения приходного ордера по перемещению, предусмотренный разработчиками 1С, — это создание документа по цепочке связей (ввод на основании). В этом случае не требуется вносить никаких изменений в программу.

Рассмотрим по шагам, как правильно выполнить эту операцию в пользовательском режиме:

  1. Перейдите в список документов Перемещение товаров (меню Документы — Запасы (склад) — Перемещение товаров).
  2. Найдите и выделите курсором документ-источник, по которому необходимо оформить поступление на склад-получатель. Обратите внимание: дата приходного ордера должна быть позже даты самого перемещения.
  3. Нажмите на панели инструментов кнопку Ввести на основании (или воспользуйтесь сочетанием клавиш Alt + F9) и выберите в появившемся списке пункт Приходный ордер на товары.
  4. Программа автоматически создаст новый приходный ордер, установит вид операции Перемещение, заполнит реквизит Склад значением из поля Склад-получатель исходного перемещения, укажет ссылку на документ-основание и полностью скопирует весь состав табличной части (товары и возвратную тару).

Этот процесс опирается на предопределенный обработчик внутри модуля документа. Посмотрим на фрагмент кода процедуры ОбработкаЗаполнения, которая отрабатывает в этот момент на стороне сервера:


ИначеЕсли ТипЗнч(Основание) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
    
    // Заполним реквизиты из стандартного набора.
    ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЭтотОбъект, Основание);
    ВидОперации         = Перечисления.ВидыОперацийПриходныйОрдер.Перемещение;
    Склад               = Основание.СкладПолучатель;
    ДокументПеремещения = Основание.Ссылка;
    
    // Заполним табличную часть "Товары" по перемещению, скопировав состав.
    ЗаполнитьТоварыПоОснованию(Основание);
    ЗаполнитьВозвратнуюТаруПоОснованию(Основание);
КонецЕсли;

Как видим, при вводе на основании система идеально отрабатывает заполнение всех реквизитов. Пользователю остается только проверить количество и провести документ.

---

Решение №2: Использование внешних обработок заполнения табличных частей

Если в вашей компании бизнес-процесс устроен так, что кладовщику неудобно сначала искать документ перемещения в общем списке, а необходимо работать именно из формы приходного ордера, можно решить задачу без снятия конфигурации с поддержки. Для этого отлично подходит механизм внешних обработок заполнения табличных частей.

Алгоритм реализации этого способа выглядит следующим образом:

  1. В конфигураторе создается новая внешняя обработка. В ее модуле объекта обязательно объявляется экспортная процедура Инициализировать:

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

---

Решение №3: Программная доработка формы документа (в Конфигураторе)

Если ваша база данных 1С уже снята с поддержки и дорабатывается программистами, вы можете внести изменения непосредственно в форму документа ПриходныйОрдерНаТовары, чтобы сделать интерфейс максимально дружелюбным для пользователя.

Выполним доработку по шагам:

  1. Откройте форму документа в Конфигураторе. В панели реквизитов (для операции перемещения) найдите поле ДокументПеремещения. Если его нет на форме, перетащите этот реквизит в область шапки документа.
  2. Для добавленного элемента управления формы определите событие ПриИзменении.
  3. В модуле формы напишите следующий обработчик, который будет очищать старые строки и заполнять новые при выборе документа перемещения:

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

Дополнительно, чтобы решить проблему с обновлением кнопки Заполнить при интерактивном переключении видов операций на форме, найдите процедуру ПриИзмененииВидаОперации (или аналогичную, отвечающую за смену вкладок и видимости реквизитов) и добавьте в ее конец принудительный вызов перестройки интерфейса кнопок:

УстановитьКнопкиПодменюЗаполненияТЧ();

После этого интерфейс программы будет мгновенно реагировать на любые действия пользователя, перестраивая состав доступных команд заполнения «на лету».

---

Как этот процесс устроен в современных решениях 1С (ERP, КА 2, УТ 11)

Проанализировав старые интерфейсные подходы, полезно посмотреть, как эта же задача решается в современных конфигурациях 1С на управляемых формах. В таких программных продуктах, как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация 2 или 1С:Управление торговлей 11, архитектура работы ордерного склада была полностью переосмыслена.

Современная методология исключает необходимость ручного поиска документов перемещения или программирования кнопок заполнения на формах документов:

← На главную