При работе в среде 1С:Предприятие 7.7 разработчики и администраторы часто сталкиваются с ситуацией, когда типовой механизм «Ввод на основании» перегружает интерфейс пользователя. Например, в системе существует документ-источник (допустим, «Отгрузка продукции»), и на его основании должен создаваться строго один документ-приемник — «Предоставление скидки». Однако на практике при нажатии кнопки «Ввести на основании» пользователь видит огромный, пугающий список всех возможных документов системы.
В этой статье мы подробно разберем, почему возникает такая ситуация, как быстро решить эту проблему в Конфигураторе 1С 7.7, детально изучим программную реализацию переноса данных и посмотрим, как этот механизм эволюционировал в современных версиях платформы 1С 8.
Для начала проанализируем, как платформа 1С 7.7 определяет, какие именно документы должны выводиться в меню ввода на основании для конкретного объекта. За эту логику отвечает специальная глобальная настройка в свойствах каждого метаданного.
Когда вы создаете связь между документами, платформа анализирует связи «источник-приемник». Но у каждого документа по умолчанию активирована одна коварная опция — «Может являться основанием для документа любого вида». Если этот флажок установлен у документа-источника («Отгрузка продукции»), система полностью игнорирует точечно настроенные связи метаданных. Она автоматически предлагает пользователю создать на основании этого документа абсолютно любой другой документ конфигурации, у которого в принципе прописана техническая возможность ввода на основании.
Чтобы исправить это поведение и сделать интерфейс чистым и понятным, нам потребуется внести изменения в Конфигураторе.
Рассмотрим по шагам, как настроить отображение только нужных документов в меню:
Теперь при запуске системы в режиме «1С:Предприятие» при нажатии кнопки «Ввести на основании» на документе «Отгрузка продукции» пользователь увидит только одну команду создания документа «Предоставление скидки», либо документ создастся автоматически сразу (если подчиненный документ всего один в списке разрешенных).
Настройки в Конфигураторе лишь управляют видимостью меню. Чтобы реквизиты нового документа («Предоставление скидки») автоматически заполнились данными из документа-основания («Отгрузка продукции»), разработчик должен написать соответствующий код.
В платформе 1С 7.7 для этого используется предопределенная процедура ВводНаОсновании(). Обратите внимание: она должна быть прописана строго в модуле формы документа-приемника (в нашем случае — в модуле формы документа «Предоставление скидки»).
Рассмотрим подробнее классический пример программной реализации этой процедуры:
Процедура ВводНаОсновании(ДокОсн)
// Проверяем, что документ-основание передан и имеет правильный тип
Если ПустоеЗначение(ДокОсн) = 0 Тогда
Если ДокОсн.Вид() = "ОтгрузкаПродукции" Тогда
// Переносим реквизиты шапки документа
Контрагент = ДокОсн.Контрагент;
Договор = ДокОсн.Договор;
// Если в документе-приемнике есть табличная часть, заполняем ее
ДокОсн.ВыбратьСтроки();
Пока ДокОсн.ПолучитьСтроку() = 1 Цикл
НоваяСтрока();
Товар = ДокОсн.Товар;
Количество = ДокОсн.Количество;
Цена = ДокОсн.Цена;
Сумма = ДокОсн.Сумма;
КонецЦикла;
// Выводим сообщение для пользователя
Сообщить("Документ успешно заполнен на основании: " + Строка(ДокОсн));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Иногда требуется поставить жесткое условие или запретить ввод на основании при невыполнении определенных бизнес-правил (например, если документ-источник не проведен или скидка по нему уже предоставлялась ранее). Чтобы прервать создание нового документа, используем команду СтатусВозврата(0):
Процедура ВводНаОсновании(ДокОсн)
Если ДокОсн.Вид() = "ОтгрузкаПродукции" Тогда
// Проверяем, проведен ли исходный документ
Если ДокОсн.Проведен() = 0 Тогда
Предупреждение("Нельзя вводить скидку на основании непроведенного документа отгрузки!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
// Перенос данных...
КонецЕсли;
КонецПроцедуры
Если вам необходимо вызвать этот механизм программно (например, при нажатии на кастомную кнопку на форме), в 1С 7.7 используется функция ОткрытьФорму(), куда передается контекст и документ-основание:
// Пример программного вызова из модуля формы другого документа или обработки
ОткрытьФорму("Документ.ПредоставлениеСкидки", КонтекстФормы, КонкретныйДокументОтгрузки);
Развитие платформы 1С:Предприятие 8 принесло кардинальные улучшения в архитектуру ввода на основании. Давайте проанализируем основные отличия и эволюцию этого механизма:
ВводНаОсновании жестко привязана к форме документа. Это создавало огромные трудности, если документ требовалось создать программно (например, при фоновом обмене данными, через Web-сервисы или в регламентных заданиях на сервере) без открытия диалогового окна.
В 1С 8 обработка заполнения происходит в модуле объекта внутри процедуры ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка). Это позволяет создавать и заполнять документы на сервере без привлечения графического интерфейса.
Для наглядности сравним, как выглядит аналогичное заполнение документа в 1С 8.x:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Проверяем тип входящих данных заполнения
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ОтгрузкаПродукции") Тогда
// Заполняем реквизиты шапки
ЭтотОбъект.Контрагент = ДанныеЗаполнения.Контрагент;
ЭтотОбъект.Договор = ДанныеЗаполнения.Договор;
// Заполняем табличную часть с помощью встроенных механизмов платформы
Для Каждого СтрокаИсточника Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = ЭтотОбъект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Изменяя свойства документов в Конфигураторе 1С 7.7 (особенно в типовых решениях, таких как «Бухгалтерский учет» или «Торговля и Склад»), всегда помните о последующей поддержке. Как справедливо замечают опытные специалисты, глубокое вмешательство в метаданные типовых конфигураций усложняет процесс их обновления в будущем.
Чтобы минимизировать проблемы при обновлениях:
Мы успешно разобрались, как оптимизировать меню ввода на основании, избавились от перегруженного интерфейса в 1С 7.7 и рассмотрели практические примеры написания кода для автоматического заполнения документов.