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