Как убрать лишние документы из меню «Ввод на основании» в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе в среде 1С:Предприятие 7.7 разработчики и администраторы часто сталкиваются с ситуацией, когда типовой механизм «Ввод на основании» перегружает интерфейс пользователя. Например, в системе существует документ-источник (допустим, «Отгрузка продукции»), и на его основании должен создаваться строго один документ-приемник — «Предоставление скидки». Однако на практике при нажатии кнопки «Ввести на основании» пользователь видит огромный, пугающий список всех возможных документов системы.

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

Выясняем причину: почему отображается весь список документов?

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

Когда вы создаете связь между документами, платформа анализирует связи «источник-приемник». Но у каждого документа по умолчанию активирована одна коварная опция — «Может являться основанием для документа любого вида». Если этот флажок установлен у документа-источника («Отгрузка продукции»), система полностью игнорирует точечно настроенные связи метаданных. Она автоматически предлагает пользователю создать на основании этого документа абсолютно любой другой документ конфигурации, у которого в принципе прописана техническая возможность ввода на основании.

Чтобы исправить это поведение и сделать интерфейс чистым и понятным, нам потребуется внести изменения в Конфигураторе.

Пошаговое решение проблемы в Конфигураторе 1С 7.7

Рассмотрим по шагам, как настроить отображение только нужных документов в меню:

  1. Запустите базу данных в режиме Конфигуратор.
  2. В дереве метаданных найдите документ-источник (в нашем примере это «Отгрузка продукции»).
  3. Дважды кликните по нему, чтобы открыть окно свойств документа.
  4. В окне свойств перейдите на вкладку или нажмите кнопку «Ввод на основании». Перед вами откроется диалоговое окно настройки связей.
  5. Внимательно изучите это окно. Оно состоит из двух ключевых списков:
    • «Вводить на основании» (список документов, на основании которых может быть создан текущий документ).
    • «Является основанием для» (список документов, которые могут быть созданы на основании текущего).
  6. Найдите под списками флажок «Может являться основанием для документа любого вида». По умолчанию он будет включен. Снимите эту галочку!
  7. После снятия флажка в списке «Является основанием для» вручную отметьте галочкой только те документы, которые действительно должны создаваться на основании текущего (в нашем случае — только документ «Предоставление скидки»).
  8. Сохраните изменения в конфигурации (нажмите клавишу F7 или выберите «Сохранить» в меню «Файл»).

Теперь при запуске системы в режиме «1С:Предприятие» при нажатии кнопки «Ввести на основании» на документе «Отгрузка продукции» пользователь увидит только одну команду создания документа «Предоставление скидки», либо документ создастся автоматически сразу (если подчиненный документ всего один в списке разрешенных).

Программная настройка механизма ввода на основании в 1С 7.7

Настройки в Конфигураторе лишь управляют видимостью меню. Чтобы реквизиты нового документа («Предоставление скидки») автоматически заполнились данными из документа-основания («Отгрузка продукции»), разработчик должен написать соответствующий код.

В платформе 1С 7.7 для этого используется предопределенная процедура ВводНаОсновании(). Обратите внимание: она должна быть прописана строго в модуле формы документа-приемника (в нашем случае — в модуле формы документа «Предоставление скидки»).

Рассмотрим подробнее классический пример программной реализации этой процедуры:


Процедура ВводНаОсновании(ДокОсн)
    // Проверяем, что документ-основание передан и имеет правильный тип
    Если ПустоеЗначение(ДокОсн) = 0 Тогда
        Если ДокОсн.Вид() = "ОтгрузкаПродукции" Тогда
            
            // Переносим реквизиты шапки документа
            Контрагент = ДокОсн.Контрагент;
            Договор = ДокОсн.Договор;
            
            // Если в документе-приемнике есть табличная часть, заполняем ее
            ДокОсн.ВыбратьСтроки();
            Пока ДокОсн.ПолучитьСтроку() = 1 Цикл
                НоваяСтрока();
                Товар = ДокОсн.Товар;
                Количество = ДокОсн.Количество;
                Цена = ДокОсн.Цена;
                Сумма = ДокОсн.Сумма;
            КонецЦикла;
            
            // Выводим сообщение для пользователя
            Сообщить("Документ успешно заполнен на основании: " + Строка(ДокОсн));
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Иногда требуется поставить жесткое условие или запретить ввод на основании при невыполнении определенных бизнес-правил (например, если документ-источник не проведен или скидка по нему уже предоставлялась ранее). Чтобы прервать создание нового документа, используем команду СтатусВозврата(0):


Процедура ВводНаОсновании(ДокОсн)
    Если ДокОсн.Вид() = "ОтгрузкаПродукции" Тогда
        // Проверяем, проведен ли исходный документ
        Если ДокОсн.Проведен() = 0 Тогда
            Предупреждение("Нельзя вводить скидку на основании непроведенного документа отгрузки!");
            СтатусВозврата(0);
            Возврат;
        КонецЕсли;
        
        // Перенос данных...
    КонецЕсли;
КонецПроцедуры

Если вам необходимо вызвать этот механизм программно (например, при нажатии на кастомную кнопку на форме), в 1С 7.7 используется функция ОткрытьФорму(), куда передается контекст и документ-основание:


// Пример программного вызова из модуля формы другого документа или обработки
ОткрытьФорму("Документ.ПредоставлениеСкидки", КонтекстФормы, КонкретныйДокументОтгрузки);

Как изменился механизм «Ввод на основании» в платформе 1С 8?

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

  1. Перенос кода из модуля формы в модуль объекта: В 1С 7.7 процедура ВводНаОсновании жестко привязана к форме документа. Это создавало огромные трудности, если документ требовалось создать программно (например, при фоновом обмене данными, через Web-сервисы или в регламентных заданиях на сервере) без открытия диалогового окна. В 1С 8 обработка заполнения происходит в модуле объекта внутри процедуры ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка). Это позволяет создавать и заполнять документы на сервере без привлечения графического интерфейса.
  2. Интеллектуальный Конструктор: В Конфигураторе 1С 8 встроен удобный визуальный конструктор ввода на основании. Разработчику достаточно указать реквизиты источника и приемника, и система сама сгенерирует готовый программный код сопоставления полей шапки и табличных частей.
  3. Пользовательская настройка без программиста (в управляемом приложении): В современных конфигурациях (например, на платформе 1С 8.3 с управляемыми формами) пользователям больше не нужно обращаться к программисту, чтобы скрыть лишние элементы меню. Прямо в режиме предприятия через меню «Еще -> Настройка ввода на основании» каждый пользователь может гибко настроить этот список под свои повседневные задачи.

Для наглядности сравним, как выглядит аналогичное заполнение документа в 1С 8.x:


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

Важное замечание по поддержке и обновлениям

Изменяя свойства документов в Конфигураторе 1С 7.7 (особенно в типовых решениях, таких как «Бухгалтерский учет» или «Торговля и Склад»), всегда помните о последующей поддержке. Как справедливо замечают опытные специалисты, глубокое вмешательство в метаданные типовых конфигураций усложняет процесс их обновления в будущем.

Чтобы минимизировать проблемы при обновлениях:

Мы успешно разобрались, как оптимизировать меню ввода на основании, избавились от перегруженного интерфейса в 1С 7.7 и рассмотрели практические примеры написания кода для автоматического заполнения документов.

← На главную