При работе в конфигурациях 1С:Предприятие 8 прошлых поколений (таких как Управление торговым предприятием (УТП), Управление производственным предприятием (УПП 1.3), Управление торговлей (УТ 10.3) или Комплексная автоматизация (КА 1.1)) пользователи часто сталкиваются с неочевидным поведением интерфейса обычных форм. Типичный сценарий: кладовщик создает новый документ Приходный ордер на товары, вручную выбирает вид операции Перемещение, указывает склад-получатель, а при попытке заполнить табличную часть через кнопку Заполнить сталкивается с тем, что программа предлагает варианты только для работы с поставщиками (например, «по заказу поставщика» или «по счету поставщика»).
В этой статье мы подробно разберем, почему так происходит, рассмотрим стандартные варианты решения этой проблемы без изменения конфигурации, а также покажем технические способы доработки системы для программистов (через Конфигуратор или внешние обработки).
Для того чтобы понять логику программы, обратимся к архитектуре обычных форм в решениях 1С. Кнопка Заполнить над табличной частью товаров инициализируется динамически при открытии формы документа. За это отвечает специализированный программный код.
Давайте проанализируем процедуру инициализации кнопок заполнения табличной части:
Процедура УстановитьКнопкиПодменюЗаполненияТЧ()
мКнопкиЗаполненияТЧ = УниверсальныеМеханизмы.ПолучитьДеревоКнопокЗаполненияТабличныхЧастей(Ссылка, Новый Действие("НажатиеНаДополнительнуюКнопкуЗаполненияТЧ"));
СоответствиеТЧ = Новый Соответствие;
СоответствиеТЧ.Вставить(ЭлементыФормы.Товары, ЭлементыФормы.КоманднаяПанельТовары.Кнопки.ПодменюЗаполнить);
СоответствиеТЧ.Вставить(ЭлементыФормы.ВозвратнаяТара, ЭлементыФормы.КоманднаяПанельВозвратнаяТара.Кнопки.ПодменюЗаполнить);
УниверсальныеМеханизмы.СформироватьПодменюЗаполненияТЧ(мКнопкиЗаполненияТЧ, СоответствиеТЧ);
КонецПроцедуры
Эта процедура выполняется один раз при открытии формы. Механизм динамического построения меню анализирует текущие реквизиты документа. Поскольку по умолчанию новый документ создается с операцией «От поставщика», дерево кнопок формируется исключительно под этот сценарий.
Когда пользователь интерактивно меняет на форме вид операции на Перемещение, обработчик смены операции не инициирует повторный вызов перерисовки меню заполнения. Более того, в типовом коде этих конфигураций в принципе отсутствует встроенный алгоритм интерактивного заполнения ордера по перемещению прямо из формы созданного документа. Разработчики фирмы 1С изначально заложили другую логику бизнес-процесса.
---
Самый простой и правильный способ заполнения приходного ордера по перемещению, предусмотренный разработчиками 1С, — это создание документа по цепочке связей (ввод на основании). В этом случае не требуется вносить никаких изменений в программу.
Рассмотрим по шагам, как правильно выполнить эту операцию в пользовательском режиме:
Alt + F9) и выберите в появившемся списке пункт Приходный ордер на товары.Склад значением из поля Склад-получатель исходного перемещения, укажет ссылку на документ-основание и полностью скопирует весь состав табличной части (товары и возвратную тару).Этот процесс опирается на предопределенный обработчик внутри модуля документа. Посмотрим на фрагмент кода процедуры ОбработкаЗаполнения, которая отрабатывает в этот момент на стороне сервера:
ИначеЕсли ТипЗнч(Основание) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
// Заполним реквизиты из стандартного набора.
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЭтотОбъект, Основание);
ВидОперации = Перечисления.ВидыОперацийПриходныйОрдер.Перемещение;
Склад = Основание.СкладПолучатель;
ДокументПеремещения = Основание.Ссылка;
// Заполним табличную часть "Товары" по перемещению, скопировав состав.
ЗаполнитьТоварыПоОснованию(Основание);
ЗаполнитьВозвратнуюТаруПоОснованию(Основание);
КонецЕсли;
Как видим, при вводе на основании система идеально отрабатывает заполнение всех реквизитов. Пользователю остается только проверить количество и провести документ.
---
Если в вашей компании бизнес-процесс устроен так, что кладовщику неудобно сначала искать документ перемещения в общем списке, а необходимо работать именно из формы приходного ордера, можно решить задачу без снятия конфигурации с поддержки. Для этого отлично подходит механизм внешних обработок заполнения табличных частей.
Алгоритм реализации этого способа выглядит следующим образом:
Инициализировать:
Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
// Проверим, что документ находится в режиме "Перемещение"
Если Объект.ВидОперации <> Перечисления.ВидыОперацийПриходныйОрдер.Перемещение Тогда
Предупреждение("Данная обработка предназначена только для операции 'Перемещение'!");
Возврат;
КонецЕсли;
// Открываем форму выбора документа перемещения
ПараметрыФормы = Новый Структура("Отбор", Новый Структура("СкладПолучатель", Объект.Склад));
ФормаВыбора = Документы.ПеремещениеТоваров.ПолучитьФормуВыбора(, ТабличноеПолеОбъекта);
ДокументОснование = ФормаВыбора.ОткрытьМодально();
Если ЗначениеЗаполнено(ДокументОснование) Тогда
Объект.ДокументПеремещения = ДокументОснование;
Объект.Товары.Очистить();
// Заполняем ТЧ аналогично штатному механизму
Для Каждого СтрокаТЧ Из ДокументОснование.Товары Цикл
НоваяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
УниверсальныеМеханизмы.ПолучитьДеревоКнопокЗаполненияТабличныхЧастей автоматически считает ее наличие и добавит новую команду прямо в подменю кнопки Заполнить на форме приходного ордера, при этом конфигурация останется полностью типовой и закрытой для изменений.---
Если ваша база данных 1С уже снята с поддержки и дорабатывается программистами, вы можете внести изменения непосредственно в форму документа ПриходныйОрдерНаТовары, чтобы сделать интерфейс максимально дружелюбным для пользователя.
Выполним доработку по шагам:
ДокументПеремещения. Если его нет на форме, перетащите этот реквизит в область шапки документа.ПриИзменении.
Процедура ДокументПеремещенияПриИзменении(Элемент)
Если ЗначениеЗаполнено(ДокументПеремещения) Тогда
Если Товары.Количество() > 0 Тогда
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос("Табличная часть товаров будет очищена и перезаполнена. Продолжить?", Режим);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Товары.Очистить();
ВозвратнаяТара.Очистить();
// Вызываем типовые серверные процедуры заполнения
ЗаполнитьТоварыПоОснованию(ДокументПеремещения);
ЗаполнитьВозвратнуюТаруПоОснованию(ДокументПеремещения);
КонецЕсли;
КонецПроцедуры
Дополнительно, чтобы решить проблему с обновлением кнопки Заполнить при интерактивном переключении видов операций на форме, найдите процедуру ПриИзмененииВидаОперации (или аналогичную, отвечающую за смену вкладок и видимости реквизитов) и добавьте в ее конец принудительный вызов перестройки интерфейса кнопок:
УстановитьКнопкиПодменюЗаполненияТЧ();
После этого интерфейс программы будет мгновенно реагировать на любые действия пользователя, перестраивая состав доступных команд заполнения «на лету».
---
Проанализировав старые интерфейсные подходы, полезно посмотреть, как эта же задача решается в современных конфигурациях 1С на управляемых формах. В таких программных продуктах, как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация 2 или 1С:Управление торговлей 11, архитектура работы ордерного склада была полностью переосмыслена.
Современная методология исключает необходимость ручного поиска документов перемещения или программирования кнопок заполнения на формах документов: