Передача данных в обработку 1С 8.3: выделенные строки, параметры, Excel и запрос

· 9 мин

Содержание

Передать данные в обработку 1С можно четырьмя путями: выделить строки в списке и вызвать команду обработки (ссылки придут массивом в ПараметрКоманды), передать структуру в параметры формы через ОткрытьФорму(), вставить таблицу в поле табличного документа или собрать набор запросом прямо внутри обработки. Для внешней обработки в типовых конфигурациях есть ещё регистрация в справочнике дополнительных обработок — тогда объекты назначения приходят в обработку сами.

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

Какой способ передачи данных выбрать

Сначала определите, откуда берутся данные и кто запускает обработку. От этого зависит всё остальное.

СпособКто запускаетОткуда данныеКогда подходит
Команда с выделенными строкамиПользовательФорма списка или документаОбработать 5–500 конкретных объектов
Параметры формыПрограммистДругая форма или модульВызов обработки из своего кода
Параметр запуска /CАдминистраторКомандная строка, ярлыкРегламентный запуск, автоматизация
Табличный документПользовательExcel, буфер обмена, файлЗагрузка списков, цен, остатков
Запрос внутри обработкиОбработка самаБаза данныхОтбор по условиям, массовые операции

💡 Если пользователь может сформулировать условие отбора («все контрагенты без ИНН»), не заставляйте его выделять строки руками. Дайте в обработке поля отбора и соберите данные запросом.

Откуда берутся данные для обработки?

1. Передача выделенных строк из списка в обработку

Самый понятный пользователю сценарий: выделил строки, нажал кнопку, обработка получила выбранное. Выделение — через Ctrl (по одной строке) или Shift (диапазон), всё — Ctrl+A.

Обработка в составе конфигурации

В конфигураторе у обработки создаётся команда со свойствами:

  • 🔹 Тип параметра команды — например, СправочникСсылка.Номенклатура (можно составной тип);
  • 🔹 Режим использования параметра — Множественный, чтобы пришли все выделенные строки, а не одна;
  • 🔹 Группа — форма списка, панель навигации или командная панель формы объекта.

В модуле команды выделенные ссылки приходят массивом:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

	ПараметрыФормы = Новый Структура("Ссылки", ПараметрКоманды);
	ОткрытьФорму("Обработка.ОбработкаНоменклатуры.Форма.Форма",
		ПараметрыФормы,
		ПараметрыВыполненияКоманды.Источник,
		ПараметрыВыполненияКоманды.Уникальность,
		ПараметрыВыполненияКоманды.Окно);

КонецПроцедуры

При режиме Однократный в ПараметрКоманды придёт одна ссылка, а не массив. Если команду переключили между режимами, а код не поменяли, обработка упадёт на первом же Для Каждого.

Внешняя обработка в типовой конфигурации

В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3, УТ 11 и другие) внешнюю обработку регистрируют как назначаемую. Она получает объекты назначения без собственного кода выделения. Порядок для пользователя:

  1. Включите дополнительные обработки: Администрирование → Печатные формы, отчеты и обработки, флажок «Дополнительные отчеты и обработки».
  2. Откройте список «Дополнительные отчеты и обработки» там же и добавьте файл .epf кнопкой «Добавить из файла».
  3. В карточке на закладке команд укажите, в каких разделах и списках показывать команду, и при необходимости — пользователей.
  4. Откройте нужный список, выделите строки и запустите команду. Кнопка дополнительных обработок появляется на командной панели списка; в некоторых формах её прячут в меню «Ещё».

Программисту, чтобы обработка регистрировалась как назначаемая, в модуль объекта добавляют функцию регистрации:

Функция СведенияОВнешнейОбработке() Экспорт

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.1.1");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиНазначаемаяОбработка();
	ПараметрыРегистрации.Назначение.Добавить("Справочник.Номенклатура");
	ПараметрыРегистрации.Версия = "1.0";

	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Представление = "Обработать выделенные";
	Команда.Идентификатор = "ОбработатьВыделенные";
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
	Команда.ПоказыватьОповещение = Истина;

	Возврат ПараметрыРегистрации;

КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт

	Для Каждого Ссылка Из ОбъектыНазначения Цикл
		// обработка каждого выделенного элемента
	КонецЦикла;

КонецПроцедуры

Если команда открывает форму (тип «Открытие формы»), массив ссылок приходит в форму параметром ОбъектыНазначения.

Выделенные строки табличной части

Когда нужно передать не документы, а строки внутри документа, берите идентификаторы из элемента формы: Элементы.Товары.ВыделенныеСтроки. Это массив идентификаторов строк, а не самих строк. Строку получают так: Объект.Товары.НайтиПоИдентификатору(Идентификатор).

2. Как передать параметры при открытии обработки и запуске 1С

Параметры формы

Любую форму обработки можно открыть с параметрами. Два условия:

  1. Параметр объявлен в форме на закладке «Параметры» (имя и тип).
  2. Значение читается в ПриСозданииНаСервере, пока форма ещё не показана.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Если Параметры.Свойство("Ссылки") И ЗначениеЗаполнено(Параметры.Ссылки) Тогда
		ЗаполнитьТаблицуПоСсылкам(Параметры.Ссылки);
	КонецЕсли;

КонецПроцедуры

Если параметр не объявлен в форме, переданное значение пропадёт, а прямое обращение Параметры.Ссылки вызовет ошибку Поле объекта не обнаружено (Ссылки). Проверка через Параметры.Свойство() страхует от падения, но не от потери данных.

Через параметры передают только то, что живёт и на клиенте, и на сервере: примитивы, ссылки, массивы, структуры, соответствия. ТаблицаЗначений и объекты (СправочникОбъект, ДокументОбъект) на клиент не попадают. Таблицу кладут во временное хранилище, а в параметр передают адрес:

// на сервере в вызывающей форме
АдресТаблицы = ПоместитьВоВременноеХранилище(ТаблицаДанных, УникальныйИдентификатор);

// в форме обработки, ПриСозданииНаСервере
ТаблицаДанных = ПолучитьИзВременногоХранилища(Параметры.АдресТаблицы);

Возврат результата из обработки

Передача работает и в обратную сторону. Форма обработки закрывается методом Закрыть(Результат), а вызывающий код получает значение в процедуре, указанной в ОписаниеОповещения при вызове ОткрытьФорму(). Так обработка подбора отдаёт выбранные строки обратно в документ.

Параметр запуска из командной строки

Для регламентных сценариев данные передают прямо в ярлык или скрипт ключом /C:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Робот" /P"пароль" /C"Склад=Основной;Дата=20250131"

Строка после /C доступна в коде через глобальное свойство ПараметрЗапуска. Разбирать её приходится самостоятельно, например через СтрРазделить(ПараметрЗапуска, ";"). Внешнюю обработку можно открыть сразу при старте ключом /Execute "D:\Tools\Загрузка.epf".

💡 Номер версии платформы в пути подставьте свой. Пароль в ярлыке виден любому, кто откроет его свойства, поэтому для робота заведите отдельного пользователя с минимальными правами.

3. Табличный документ как источник данных для обработки

Для пользователя это самый простой путь «из Excel в обработку». На форме обработки размещают реквизит типа ТабличныйДокумент. Пользователь копирует диапазон в Excel и вставляет его в поле через Ctrl+V.

Чтение ячеек на сервере:

&НаСервере
Процедура ЗагрузитьИзТабличногоДокумента()

	Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл  // 1-я строка — заголовки

		Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
		Если ПустаяСтрока(Артикул) Тогда
			Продолжить;
		КонецЕсли;

		НоваяСтрока = Товары.Добавить();
		НоваяСтрока.Артикул = Артикул;
		НоваяСтрока.Количество = СтрокуВЧисло(ТабДок.Область(НомерСтроки, 2).Текст);

	КонецЦикла;

КонецПроцедуры

Что учесть при таком способе:

  • 📌 ВысотаТаблицы считает строки до последней заполненной. Пустые строки в середине пропускайте явно, как в примере.
  • 📌 Из Excel приходит текст, а не числа и даты. Типы приводите сами (см. раздел про ошибки).
  • 📌 Порядок колонок пользователь может перепутать. Надёжнее найти колонки по заголовкам в первой строке, чем жёстко прописывать номера.
  • 📌 Файл без копирования читается методом Прочитать() табличного документа: передайте путь к .xlsx на сервере.

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

4. Программная передача набора данных через запрос

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

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

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",, , Новый КвалификаторыЧисла(15, 3)));
// ... заполнение ТЗ

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

У колонок таблицы-параметра обязательно должны быть заданы типы. Без ОписаниеТипов запрос не выполнится: платформа не знает, какое поле создавать во временной таблице.

Строки, где после соединения Номенклатура пустая, — это артикулы, которых нет в базе. Покажите их пользователю отдельным списком, а не пропускайте молча.

Табличную часть формы обработки в запрос передают через РеквизитФормыВЗначение("Объект").Товары.Выгрузить() на сервере. Обратно результат кладут методом ЗначениеВРеквизитФормы().

5. Ошибки при передаче данных и преобразовании типов

Большая часть сбоев появляется не в самой передаче, а на стыке типов и контекстов. Короткая карта:

СимптомПричинаРешение
Преобразование значения к типу Число не может быть выполненоВ ячейке пробелы, неразрывный пробел, запятая или текстОчистить строку перед Число(), обернуть в Попытка
Дата приходит пустойДата() ждёт строку ГГГГММДДччммсс, а в Excel — 31.01.2025Разобрать строку на день, месяц, год
Поле объекта не обнаруженоПараметр формы не объявлен или имя с опечаткойОбъявить параметр на закладке «Параметры»
В обработку пришла одна ссылка вместо массиваРежим параметра команды ОднократныйПереключить на Множественный или проверять тип
Таблица значений не передаётся в формуТип недоступен на клиентеВременное хранилище и адрес
Запрос по таблице-параметру падаетУ колонок не заданы типыОписаниеТипов при создании колонок

Безопасное приведение строки к числу:

Функция СтрокуВЧисло(Знач Текст)

	Текст = СтрЗаменить(Текст, Символы.НПП, "");
	Текст = СтрЗаменить(Текст, " ", "");
	Текст = СтрЗаменить(Текст, ",", ".");

	Попытка
		Возврат Число(Текст);
	Исключение
		Возврат 0;
	КонецПопытки;

КонецФункции

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

Альтернатива для простых случаев — Новый ОписаниеТипов("Число").ПривестиЗначение(Значение). Метод не падает, но и не подскажет, где была ошибка.

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

6. Внешние обработки и расширения: что меняется при передаче данных

Внешняя обработка, подключённая из кода

Если открыть .epf через «Файл → Открыть», передать ей параметры нельзя — только ввести данные на её форме. Чтобы передать данные программно, обработку подключают:

&НаСервере
Функция ПодключитьОбработку(ДвоичныеДанныеФайла)

	Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
	Возврат ВнешниеОбработки.Подключить(Адрес, , Истина); // Истина — безопасный режим

КонецФункции

// на клиенте
ИмяОбработки = ПодключитьОбработку(ДвоичныеДанные);
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", Новый Структура("Ссылки", МассивСсылок));

В безопасном режиме обработке запрещены обращения к файлам на сервере, COM-объекты и привилегированный режим. Поэтому файл для загрузки передают двоичными данными через временное хранилище, а не путём к файлу.

Ещё одно отличие: при каждом подключении внешняя обработка может получить новое имя, если указано пустое. Не зашивайте имя в код, используйте возвращённое Подключить().

Обработка в расширении конфигурации

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

Плюс расширения: команду можно добавить на форму типового объекта, не снимая конфигурацию с поддержки. Минус: после обновления типовой конфигурации расширение нужно проверить, особенно если оно ссылается на реквизиты, которые могли переименовать.

Права пользователя

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

Частые вопросы

Можно ли передать данные из одной обработки в другую?
Да. Первая обработка открывает форму второй через ОткрытьФорму() со структурой параметров. Таблицы и большие наборы передают через временное хранилище, а в параметре — только адрес.
Сколько строк можно выделить и передать командой?
Жёсткого лимита нет, но массив ссылок передаётся с клиента на сервер целиком. При тысячах объектов удобнее передать условие отбора и собрать набор запросом на сервере.
Почему назначаемая внешняя обработка не видна в списке?
Обычно в карточке дополнительной обработки не включено размещение команды в нужном разделе или не назначены пользователи. Ещё одна причина — у обработки указан другой объект назначения.
Как передать в обработку файл с компьютера пользователя в веб-клиенте?
Через диалог выбора файла с помещением во временное хранилище: файл загружается на сервер, обработка получает адрес и читает двоичные данные. Путь к файлу на компьютере пользователя сервер не видит.
Сохраняются ли введённые на форме обработки данные между запусками?
Только если у реквизитов формы включено сохранение значений или код сохраняет настройки сам. По умолчанию после закрытия формы данные теряются.