К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как добавить кнопку «Заполнить» в 1С

Как добавить кнопку «Заполнить» в 1С: создание команды, размещение на форме документа, обработчик заполнения табличной части, типовые механизмы и ошибки.

Кнопка «Заполнить» — один из самых востребованных элементов в документах и обработках 1С: она запускает алгоритм, который автоматически заполняет табличную часть, шапку документа или отдельные реквизиты по заданным правилам. Пользователи привыкают к ней в типовых конфигурациях (например, «Заполнить по остаткам» в инвентаризации) и ожидают такой же удобной механики в доработанных объектах.

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

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

Определитесь со способом добавления кнопки

Прежде чем открывать конфигуратор, ответьте на два вопроса: можно ли изменять конфигурацию и где должна работать кнопка. Если конфигурация типовая и находится на полной поддержке, прямое изменение объектов усложнит будущие обновления — в этом случае правильнее использовать расширение конфигурации или механизм внешних обработок заполнения табличных частей (в конфигурациях на БСП он доступен через «Администрирование → Печатные формы, отчеты и обработки»).

Если конфигурация самописная или уже снята с поддержки, проще всего добавить команду непосредственно в форму документа. Для разовых задач администратора подойдёт внешняя обработка, открываемая через «Файл → Открыть», — она вообще не требует изменения метаданных.

Маршрут решения

Как выбрать способ

Конфигурация типовая, на поддержке, обновляется регулярноИспользуйте расширение конфигурации или внешнюю обработку заполнения табличной части
Конфигурация снята с поддержки или самописнаяДобавьте команду и кнопку прямо в форму объекта через конфигуратор
Заполнение нужно эпизодически, только администраторуСделайте внешнюю обработку и открывайте её через Файл → Открыть
Кнопка нужна в нескольких документах сразуРассмотрите общую команду или подключаемую обработку заполнения ТЧ

Добавление команды и кнопки в форму документа

Основной сценарий для управляемых форм выглядит так. Откройте конфигуратор, найдите нужный документ и откройте его основную форму. В редакторе формы перейдите на вкладку «Команды» — там есть два списка: команды формы и команды объекта. Создайте новую команду формы, например с именем ЗаполнитьПоОстаткам, и задайте ей заголовок «Заполнить» и при необходимости картинку.

В свойствах команды нажмите кнопку с лупой у поля «Действие» — конфигуратор создаст заготовку обработчика в модуле формы. В управляемых формах обработчик команды обычно клиентский, а сама логика заполнения выносится в серверную процедуру, потому что запросы к базе данных на клиенте недоступны.

После создания команды перетащите её из списка команд в дерево элементов формы — в командную панель табличной части или в общую командную панель. Проверьте, что у табличной части свойство «КоманднаяПанель» указывает на нужную панель, иначе кнопка может оказаться в подменю «Ещё».

Порядок действий в конфигураторе
  1. 1
    Откройте форму документа в конфигураторе
  2. 2
    На вкладке «Команды» создайте команду формы с заголовком «Заполнить»
  3. 3
    Назначьте команде действие — обработчик в модуле формы
  4. 4
    Перетащите команду в командную панель табличной части
  5. 5
    Реализуйте серверную процедуру заполнения
  6. 6
    Обновите конфигурацию базы данных и проверьте кнопку в режиме Предприятия

Код обработчика: клиент и сервер

Типовая структура обработчика команды в управляемой форме состоит из двух процедур. Клиентская вызывается нажатием кнопки, может показать вопрос пользователю («Табличная часть будет очищена. Продолжить?»), а затем вызывает серверную процедуру, которая выполняет запрос и заполняет данные объекта.

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

&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ ТоварыОстатки.Номенклатура, ТоварыОстатки.КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыОстатки";
	Запрос.УстановитьПараметр("Период", Объект.Дата);
	Запрос.УстановитьПараметр("Склад", Объект.Склад);
	Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры

Обратите внимание на директивы компиляции: &НаКлиенте и &НаСервере обязательны, иначе код не скомпилируется или будет выполняться не в том контексте. Если процедура не меняет данные формы, добавляйте &НаСервереБезКонтекста — это ускоряет вызов, но из такой процедуры недоступны реквизиты формы.

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

Программное создание кнопки на форме

Иногда кнопку нужно добавить динамически — например, из расширения или из общего модуля подсистемы, когда форма заранее неизвестна. Для этого в обработчике ПриСозданииНаСервере программно создают команду и элемент формы типа «Кнопка формы».

Логика такая: сначала через Команды.Добавить() создаётся команда, ей назначается действие — имя процедуры в модуле формы. Затем через Элементы.Добавить() создаётся кнопка, указывается родитель (командная панель) и имя команды. Учтите, что процедура-обработчик должна существовать в модуле формы заранее — программно её добавить нельзя.

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	НоваяКоманда = Команды.Добавить("ЗаполнитьДанные");
	НоваяКоманда.Действие = "Подключаемый_ЗаполнитьДанные";
	НоваяКоманда.Заголовок = "Заполнить";
	НоваяКнопка = Элементы.Добавить("ЗаполнитьДанные", Тип("КнопкаФормы"), Элементы.Товары.КоманднаяПанель);
	НоваяКнопка.ИмяКоманды = "ЗаполнитьДанные";
КонецПроцедуры

Кнопка «Заполнить» через расширение конфигурации

Расширение — безопасный способ доработки типовой конфигурации: основная конфигурация не меняется, обновления устанавливаются штатно. Создайте расширение через «Конфигурация → Расширения конфигурации», заимствуйте в него форму нужного документа и добавьте команду и кнопку так же, как в обычной форме.

Обработчики в расширении подключаются через аннотации &После, &Вместо, &Перед либо через собственные команды расширения. Для кнопки «Заполнить» обычно достаточно собственной команды — она не конфликтует с типовым кодом.

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

Внешние обработки заполнения табличных частей

В конфигурациях на Библиотеке стандартных подсистем (УТ, ERP, Бухгалтерия и другие) предусмотрен механизм дополнительных отчетов и обработок. Он позволяет подключить внешнюю обработку вида «ЗаполнениеОбъекта», и кнопка «Заполнить» появится в документе автоматически — без изменения формы.

Для подключения включите в режиме Предприятия опцию «Дополнительные отчеты и обработки» в разделе «Администрирование → Печатные формы, отчеты и обработки», затем добавьте файл обработки в одноимённый справочник и укажите, к каким документам она привязана. Команды обработки появятся в меню «Заполнить» или «Ещё» документа.

В самой обработке реализуется экспортная процедура ВыполнитьКоманду с предопределёнными параметрами: имя команды, коллекция объектов, дополнительные параметры. Это самый «чистый» способ для типовых конфигураций, но он требует понимания интерфейса БСП и работает только там, где библиотека внедрена.

Проверка результата и типичные ошибки

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

Контрольные точки

Как проверить результат

Кнопка видна на форме документа
Норма

Кнопка отображается в командной панели табличной части или в меню «Заполнить»

Тревожный признак

Кнопки нет — проверьте размещение команды и права пользователя

Нажатие кнопки
Норма

Табличная часть заполняется корректными данными без ошибок

Тревожный признак

Ошибка «процедура не определена» или пустой результат

Повторное нажатие
Норма

Показывается вопрос об очистке или данные корректно обновляются

Тревожный признак

Строки дублируются или старые данные теряются без предупреждения

Права обычного пользователя
Норма

Кнопка работает под ролью пользователя без полных прав

Тревожный признак

Нарушение прав доступа при обращении к регистрам

Типичные ошибки
01
Обработчик команды помечен только &НаКлиенте, а внутри — запрос к базе: запросы на клиенте недоступны, выносите их в серверную процедуру
02
Команда создана, но не перетащена в дерево элементов формы — кнопка не появляется, и разработчик ищет ошибку в коде
03
Заполнение очищает табличную часть без вопроса пользователю — введённые вручную строки теряются безвозвратно
04
Кнопка добавлена в типовую конфигурацию напрямую — после обновления доработка теряется или блокирует обновление
05
В запросе не учтены незаполненные реквизиты документа (склад, организация) — результат пустой, а пользователь считает кнопку сломанной

Часто задаваемые вопросы

Можно ли добавить кнопку «Заполнить» без программирования?

Частично. В типовых конфигурациях на БСП можно подключить готовую внешнюю обработку заполнения табличных частей через механизм дополнительных отчетов и обработок — код писать не придётся, если подходящая обработка уже существует. Полностью без разработки создать новую логику заполнения нельзя.

Почему кнопка есть, но находится в подменю «Ещё»?

Платформа автоматически переносит команды в подменю «Ещё», если командная панель переполнена или у кнопки не задано свойство важности. В редакторе формы поднимите кнопку выше в списке элементов командной панели или проверьте, что она добавлена именно в командную панель табличной части, а не в общую панель формы.

Как добавить кнопку «Заполнить» в обычные формы (не управляемые)?

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

Кнопка работает у администратора, но не у пользователя. В чём причина?

Чаще всего не хватает прав: у роли пользователя нет доступа на чтение регистра или справочника, из которых берутся данные, либо нет права на изменение самого документа. Проверьте журнал регистрации — там фиксируются события «Отказ в доступе» с указанием объекта.

Как сделать кнопку «Заполнить» сразу в нескольких документах?

Два пути: общая команда конфигурации, у которой в свойстве «Тип параметра команды» перечислены нужные документы, — платформа сама добавит кнопку в их формы; либо внешняя обработка заполнения с привязкой к нескольким объектам через механизм дополнительных обработок БСП.

Что делать, если после обновления конфигурации кнопка из расширения пропала?

Откройте расширение и проверьте заимствованную форму: при обновлении типовая форма могла измениться, и элементы расширения «потеряли» родителя. Обновите заимствованную форму до актуального состояния, заново разместите кнопку и проверьте, что обработчики по-прежнему подключены.

Итог

Что важно запомнить

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