Архитектура 1С для новичков: Строим первую внешнюю обработку и клиент-серверный мост. Часть вторая.

15.09.26

Разработка - Механизмы платформы 1С

Боитесь запутаться в клиент-серверной архитектуре и управляемых формах? Во второй части статьи разберем самый простой и понятный алгоритм создания моста во внешней обработке. Пошагово разберем логику работы кода: как передать файл на сервер через временное хранилище, написать код, который заставит сервер прочитать этот файл, и вывести пользователю красивое окно с сообщением. Идеально для начинающих разработчиков и студентов, делающих первые шаги в 1С.

В первой части мы разобрались, почему сервер 1С «слеп» к файлам на вашем диске C: , и подготовили поле ввода для пути к файлу. Пользователь нажал на заветные три точки ... и выбрал документ. Путь к файлу мы научились делать за 3 шага. Что дальше? Теперь нам нужна большая, красивая кнопка, которая заставит этот файл оторваться от вашего компьютера, улететь на сервер, превратиться там в данные базы и вернуть нам красивое окошко с сообщением. Давайте по шагам разберем, как спроектировать это и запустить клиент-серверный мост.

Шаг 4. Создаем кнопку действия «Загрузить». Просто нарисовать кнопку на экране мало — нужно объяснить платформе, что должно произойти при клике.

В редакторе формы нашей внешней обработки переходим на вкладку Команды (она находится в правом верхнем окне, прямо рядом с «Реквизитами»). Нажимаем зелёный плюс «Добавить» и называем нашу команду просто и понятно: Загрузить. Берем эту команду мышкой и перетаскиваем в левое верхнее окно Элементы, прямо под наше поле с путем к файлу.

На форме появится кнопка. Выделите её, откройте свойства (Alt + Enter) и в поле Заголовок укажите текст, который увидит пользователь: Загрузить.

Шаг 5. Выбор типа обработчика события. Теперь необходимо связать созданную команду с программным кодом. В свойствах команды найдите строку Действие и нажмите на пиктограмму с лупой. Платформа откроет диалоговое окно выбора. Из предложенного списка необходимо выбрать пункт: «Создать на клиенте и процедуру на сервере без контекста».

Давайте разберем, почему платформа предлагает разделение и почему выбор директивы «без контекста» (&НаСервереБезКонтекста) является наиболее правильным.

Почему процедура создается и на клиенте, и на сервере?

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

 В чем разница между «на сервере» и «на сервере без контекста»?

Когда вызывается обычная процедура &НаСервере, платформа 1С берет со стороны клиента абсолютно все данные формы (все реквизиты, таблицы, элементы интерфейса), упаковывает их и пересылает на сервер. Сервер тратит время и память на обработку этого объема информации, а затем отправляет всё обратно на клиент. Это называется «передачей контекста формы».

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

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

Нет, сразу написать туда весь код чтения файла нельзя. И в этом кроется главная архитектурная ловушка для новичков. Когда платформа генерирует пустой шаблон процедуры &НаСервереБезКонтекста, может возникнуть соблазн сразу прописать туда привычный код (например, ТабДок.Прочитать(ПутьКФайлу)). Но программа мгновенно выдаст ошибку.

Причина кроется в строгих правилах безопасности и изоляции уровней архитектуры 1С.

Сервер не имеет доступа к вашему диску: Ваша серверная процедура выполняется в сеансе операционной системы на сервере приложений 1С. Если передадим на сервер обычную строку C:\Users\Nina\Desktop\Лист Microsoft Excel.xlsx, сервер попытается найти этот файл на своем собственном жестком диске (там, где физически установлена серверная часть 1С), а не на вашем персональном компьютере. Естественно, он выдаст ошибку «Файл не найден». Бесконтекстный вызов изолирован от формы: Поскольку мы выбрали директиву БезКонтекста, серверная процедура не видит саму форму нашей обработки. Она не может напрямую «посмотреть» в реквизит ПутьКФайлу на экране. Она видит только то, что мы передадим ей «в руках» через параметры. Именно поэтому мы не можем сразу приступить к разбору данных на сервере.

 Шаг 6. Прежде чем написать код нужно понять еще один нюанс. В современных версиях платформы 1С (начиная с 8.3.15) старая и привычная функция ПоместитьФайлВоВременноеХранилище() признана устаревшей. Браузеры и операционные системы больше не разрешают программам «намертво» замораживать интерфейс пользователя, пока тяжелый файл летит по сети на сервер. Платформа требует, чтобы загрузка происходила в асинхронном режиме. Это значит, что файл отправляется в фоне, а программа ждет специального сигнала о том, что передача завершена.

Именно из-за этого современного правила безопасности наш мост усложняется: к стандартной паре процедур (на клиенте и на сервере без контекста) добавляется третье промежуточное звено — процедура обратного вызова (или завершения).

Теперь мост в клиент-серверной архитектуре и управляемых формах выглядит так:

1. Процедура на клиенте запускает фоновую отправку файла и говорит системе: «Как только файл долетит до сервера, автоматически передай управление процедуре завершения». И сама сразу закрывается.

2. Процедура завершения на клиенте записывает наш файл в одну единственную адресную строку (ячейку памяти) на сервере. Сам файл в эту строку записывает встроенная функция платформы. Например, в коде этот адрес выглядит как невзрачная текстовая строка: e1cib/tempstorage/89a557bb-6927-4bda — сам файл по сети еще раз передавать не нужно, сервер найдет его в памяти именно по этому идентификатору.

Как сервер подхватывает эту строку?

Сама по себе серверная функция не узнает о появлении файла в памяти. Поэтому наша процедура завершения делает ключевой шаг: она вызывает бесконтекстную функцию сервера и передает полученную адресную строку в качестве параметра — ЗагрузитьДанныеНаСервере(РезультатПомещения.Адрес).

 3. Функция на сервере без контекста по временному адресу сохраняет файл к себе на сервер с созданным адресом, выполняет ту обработку, которую мы пропишем в коде, и возвращает на клиент ровно то сообщение, которое мы написали.

Шаг 7. Теперь, когда логика клиент-серверного моста понятна, реализуем её в коде . (Шаг 5. Выбор типа обработчика события. Теперь необходимо связать созданную команду с программным кодом. В свойствах команды найдите строку Действие и нажмите на пиктограмму с лупой. Платформа откроет диалоговое окно выбора. Из предложенного списка необходимо выбрать пункт: «Создать на клиенте и процедуру на сервере без контекста».) Скопируйте и вставьте этот код:

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


	// Обязательно удаляем за собой временный файл с диска сервера, чтобы не засорять память
	УдалитьФайлы(ИмяВременногоФайлаСервер);
	
	// 3. Возвращаем результат обработки на Клиент
	Возврат ТекстОтвета;
	
КонецФункции


 
 

&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)
	
	Если ПустаяСтрока(ПутьКФайлу) Тогда
		ПоказатьПредупреждение(, "Пожалуйста, выберите файл Excel или MXL для загрузки!");
		Возврат;
	КонецЕсли;
	
	Сообщить("--- Запуск умного импорта файла ---");
	
	// Передаем параметры напрямую в метод, убрав лишнее объявление типа
	ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьЗагрузкуЗавершение", ЭтотОбъект);
	
	НачатьПомещениеФайлаНаСервер(ОписаниеОповещения, , , , ПутьКФайлу, УникальныйИдентификатор);

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







&НаКлиенте
Процедура ВыполнитьЗагрузкуЗавершение(РезультатПомещения, ДополнительныеПараметры) Экспорт

	// ИСПРАВЛЕНО: Убрали несуществующее свойство ХранениеВыполнено
	Если РезультатПомещения = Неопределено Тогда
		ПоказатьПредупреждение(, "Ошибка при передаче файла на сервер или операция отменена!");
		Возврат;
	КонецЕсли;
	
	// Передаем серверу чистую адресную строку
	ТекстСообщения = ЗагрузитьДанныеНаСервере(РезультатПомещения.Адрес);
	
	// Выводим пользователю ровно то сообщение, которое вернул сервер
	ПоказатьПредупреждение(, ТекстСообщения);

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

 

Шаг 8. Тестируем готовую форму в режиме «1С:Предприятие»

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

Сохраните ваш файл (Файл — Сохранить как...) на рабочий стол. Он запишется в формате .epf.

Запустите вашу базу 1С в обычном пользовательском режиме (1С:Предприятие).

Нажмите Главное меню — Файл — Открыть и выберите ваш сохраненный файл с рабочего стола.

Выберите файл и нажмите на созданную кнопку действия «Загрузить».

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

Вступайте в нашу телеграмм-группу Инфостарт

1С 8.3 Управляемые формы Внешняя обработка Клиент-сервер &НаКлиенте &НаСервереБезКонтекста Временное хранилище НачатьПомещениеФайлаНаСервер ОписаниеОповещения Асинхронность ТабличныйДокумент Прочитать Excel Загрузка файлов Передача файла ПоказатьПредупреждение Разработка для новичков Обучение 1С Для студентов Пошаговое руководство

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы преобразуете необходимые документы для Wildberries, OZON, ЯндексМаркет, ЛаМода, Мегамаркет, Aliexpress, Детский мир, Магнит Маркет (быв.МагнитЭкспресс), Лемана про, ЭНФАНТА (Акушерство), Летуаль, Твой дом, Золотое Яблоко, Каспи, Авито, Аптеки+, М.Видео,Тинькоф в документы "Отчет комиссионера (агента) о продажах" и другие. Работает в 1С:БП 3.0, 1С:БП 3.0 КОРП, 1С:УТ 11, 1С:УНФ, 1С:ERP.

5490 руб.

12.08.2021    47724    625    71    

225

Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

31720 руб.

27.03.2025    90537    68    44    

77

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

12444 руб.

29.10.2014    235848    765    544    

505

SALE! 10%

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 10.09.2026, версия 9.4.0 - 10.8.0)

20740 18666 руб.

20.11.2015    178596    430    401    

546
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. siamagic 16.09.26 04:45 Сейчас в теме
"После того как платформа создала пару процедур (клиентскую и бесконтекстную серверную), у начинающих разработчиков часто возникает вопрос: «Мы же создали серверную процедуру, почему мы не можем сразу передать туда строку с путем к файлу и начать его читать?»"

Прежде чем садится программировать необходимо сходить на пару уроков информатики класса 8ого, к тому же у всех есть инет и всем должно быть очевидно что картинка на устройстве <> картинка в сети - эта базовая логика школьника.
2. Ninel_Developer 7 16.09.26 15:00 Сейчас в теме
Приветствую! Иван, если сравнивать клиент-серверную архитектуру 1С с "картинкой в сети" из курса информатики — это когнитивное искажение, которое и подводит новичков. Проблема не в школьной логике, а в бесшовности среды разработки 1С. Платформа дает разработчику иллюзию единого пространства: мы пишем код клиента и сервера в одном текстовом окне, в одном модуле формы. Более того, на локальной файловой базе (где тренируются 99% новичков) код НаСервере прекрасно прочитает файл по локальному пути C:\MyFiles\data.txt, потому что клиент и сервер физически делят один жесткий диск. Истинное понимание архитектуры начинается там, где эта иллюзия рушится — при переходе на реальный клиент-сервер (SQL, кластер на Linux, веб-клиент в браузере), где сервер физически не имеет доступа к файловой системе пользователя, а контекст вызова БезКонтекста отсекает данные формы. Статья написана как раз для того, чтобы заложить правильный фундамент распределенных систем, а не надеяться на то, что кто-то вспомнит 8-й класс. Спасибо за дискуссию!
3. Ninel_Developer 7 16.09.26 15:29 Сейчас в теме
И еще один важный момент, раз уж мы заговорили про реальность и новичков. Мы живем в 2026 году. Будем честны: сегодня 90% начинающих вообще не пишут код с нуля — за них это делает ИИ. Новичок просто просит нейросеть: "Напиши чтение файла в 1С", и Gemini или GPT и т.д выдает ему красивую серверную процедуру. ИИ генерирует синтаксически правильный код, но он не знает, где физически лежит файл у пользователя на клиенте. Ученик бездумно копирует этот код, запускает... и получает ошибку. И вот тут "школьная информатика" бессильна. Если у человека нет фундаментального понимания, почему клиент и сервер разделены, он не сможет даже правильно составить промпт для нейросети, чтобы она исправила ошибку и построила мост через Временное хранилище. Моя статья написана не для того, чтобы научить людей стучать по кнопкам (с этим ИИ уже справляется лучше многих), а для того, чтобы научить их думать как архитекторы и понимать физику процессов. Без этого в современной разработке ловить нечего.
Для отправки сообщения требуется регистрация/авторизация