Внешняя обработка 1С виснет на рабочей базе: один серверный вызов вместо тысяч
Клиент-серверный мост во внешней обработке 1С собирается из трёх частей: процедура формы на клиенте собирает параметры, серверная процедура с директивой &НаСервереБезКонтекста читает данные из базы, а обратно возвращается одна структура или таблица значений. Вызов один на всю операцию, без обращений к серверу внутри цикла. Тогда обработка не зависает после переезда с тестового стенда на рабочий сервер.
Почему внешняя обработка 1С зависает на рабочей базе, хотя на тестовой летает 🐌
Бухгалтер загружает прайс поставщика: таблица на пять тысяч строк, обработка сопоставляет каждую позицию с номенклатурой. На тестовой базе, которая лежит на ноутбуке разработчика, прайс проходит почти мгновенно. На рабочей, где база стоит на сервере, а пользователь сидит в офисе, тот же файл грузится минутами, и поверх окна программы висит «Не отвечает».
Причина в цикле. Клиентский код перебирает строки таблицы и для каждой вызывает серверную функцию поиска номенклатуры. Каждый вызов — отдельный сетевой обмен: клиент отправил параметры, подождал, получил ответ. Когда клиент и база на одном компьютере, обмен почти ничего не стоит. Но между офисом и сервером он стоит заметно, и эта цена умножается на число строк. Поэтому прайс на пять тысяч позиций превращается в пять тысяч обращений к серверу.
Вторая частая причина: директива &НаСервере там, где хватило бы &НаСервереБезКонтекста. При вызове с контекстом вместе с параметрами на сервер уезжают данные формы, в том числе таблица с загруженным прайсом. Процедуре нужен один артикул, а по сети идёт вся таблица.
Расплачивается компания рабочим временем. Пока обработка думает, бухгалтер не проводит приход, склад ждёт оприходованный товар, а в день сдачи отчётности человек смотрит на зависшее окно и не знает, закрывать его или ждать. Если обработку запускают несколько человек сразу, сервер занят её вызовами, и притормаживают соседи, которые к прайсу отношения не имеют.
Как исправить: собираем мост из трёх процедур 🔧
Сначала выберите директиву для каждой процедуры формы. Четыре варианта различаются тем, где выполняется код и что уходит по сети.
| Директива | Где выполняется | Что уходит по сети | Для чего |
|---|---|---|---|
| &НаКлиенте | На клиенте | Ничего, сервер не вызывается | Нажатия кнопок, выбор файла, открытие форм, вопросы пользователю |
| &НаСервере | На сервере, с контекстом формы | Параметры и данные формы | Процедура меняет реквизиты формы или её табличные части |
| &НаСервереБезКонтекста | На сервере, без доступа к форме | Только параметры вызова | Запросы, чтение и запись данных, проверки |
| &НаКлиентеНаСервереБезКонтекста | В обоих контекстах, без доступа к форме | Ничего: функция выполняется там, откуда её вызвали | Общие функции вроде разбора артикула или форматирования номера |
Для прайса из примера мост выглядит так.
- ✓Процедура нажатия кнопки с директивой &НаКлиенте собирает артикулы из загруженной таблицы в один массив.
- ✓Она вызывает серверную функцию с директивой &НаСервереБезКонтекста и передаёт массив целиком, одним вызовом.
- ✓Функция на сервере выполняет один запрос с условием Артикул В (&Артикулы) и собирает соответствие «артикул — ссылка на номенклатуру».
- ✓Соответствие возвращается клиенту. Ссылки между клиентом и сервером ходят без ограничений.
- ✓Клиент заполняет табличную часть по готовому соответствию и к серверу больше не обращается.
Где держать серверную логику
Если логика сложнее одного запроса, положите её в модуль объекта обработки и пометьте процедуры словом Экспорт. Форма получает объект на сервере через РеквизитФормыВЗначение с параметром Объект и вызывает его методы. Клиентский код остаётся тонким, а серверную часть можно проверять отдельно.
Что можно передавать через границу
Между клиентом и сервером ходят примитивные типы, ссылки, массивы, структуры, соответствия и таблицы значений. Объекты вроде ДокументОбъект, а также Запрос и Выборка на клиент не передаются. Чтобы записать документ, клиент отправляет ссылку и данные, а сам объект создаётся и записывается на сервере.
Как исправить типичные ошибки при вызове сервера из обработки 🛠
«Процедура или функция с указанным именем не определена»
Чаще всего причин две. Первая: серверная процедура вызывает клиентскую, например, чтобы задать пользователю вопрос. На сервере клиентского кода нет, и платформа его не находит. Вторая: форма обращается к методу модуля объекта, у которого нет слова Экспорт. Лечение простое: серверная часть возвращает результат, а клиентская решает, что показать пользователю.
Серверная процедура не видит введённых данных
В &НаСервереБезКонтекста нет доступа к реквизитам формы, и это сделано намеренно. Всё, что нужно процедуре, передавайте параметрами: период, организацию, массив артикулов. Если параметров много, соберите их в структуру.
Обработка работает из файла, но не из дополнительных обработок
Обработка, подключённая через раздел «Дополнительные отчёты и обработки» с включённым безопасным режимом, не может писать файлы на диск, обращаться к почте и внешним ресурсам. Нужное разрешение выдаёт администратор, а ограничения на сервере кластера задаются в профилях безопасности. Откройте обработку из файла и сравните поведение: разница покажет, что дело в режиме, а не в коде.
Что делать, если ошибка повторяется или обработка всё равно тормозит
Когда цикл с вызовами убран, а скорость не изменилась, проверяйте по порядку.
Сначала измерьте, а не угадывайте. Технологический журнал фиксирует каждый серверный вызов с длительностью: по нему видно, остался ли вызов в цикле и какой запрос занимает основное время.
Затем проверьте запрос. Поиск по реквизиту «Артикул» без индекса читает весь справочник, и на большом справочнике это заметно. Для реквизита, по которому ищете, включите индексирование.
Потом проверьте железо и сеть. Прогоните тест Гилёва на сервере и сравните результат с системными требованиями 1С. Слабый сервер или перегруженная сеть замедляют каждый вызов, даже когда вызовов осталось мало.
Как предотвратить: правила для обработок, которые живут больше года
- ✓Один вызов сервера на одно действие пользователя. Серверный вызов внутри цикла должен останавливать проверку кода.
- ✓По умолчанию &НаСервереБезКонтекста. Директиву &НаСервере берите, только когда процедура меняет реквизиты формы.
- ✓Тест на копии рабочей базы. На пустой базе обработка работает, на базе с пятью годами данных может не заработать.
- ✓Не обращайтесь напрямую к реквизитам, которые типовая конфигурация может убрать. После очередного релиза такая обработка падает с ошибкой «Поле объекта не обнаружено». Перед обновлением 1С мы сначала прогоняем внешние обработки на копии базы и правим то, что сломалось.
- ✓Когда логика разрослась, переносите её в расширение конфигурации. Так доработка 1С переживает обновления и не лежит файлом на чьём-то рабочем столе.
Отдельный тревожный признак: на каждую задачу в базе появляется своя обработка. Значит, типовой функционал не настроен, и пользователи обходят его вручную. Это лечится внедрением 1С, доведённым до конца, а не ещё одной обработкой.
Что мы делаем с внешними обработками и сколько это стоит 💼
Берём обработку, смотрим код, затем технологический журнал на рабочей базе. Переписываем вызовы на один серверный, проверяем на копии базы и только потом ставим в рабочую. Работа идёт по ставке сопровождения 1С: 3800 руб/час. Оценку в часах даём после просмотра кода, до начала работ.
Чаще всего в Москве к нам приходят с одной историей: обработку писал программист на разовой подработке, документации нет, а перенос базы на новый сервер или обновление конфигурации её ломает. Администратор и разработчик у нас в одной команде, поэтому причину ищем по обе стороны моста: в коде формы и в сервере с сетью. Если база стоит в офисе на слабом компьютере, переносим её на арендованный сервер 1С, цена от 1 100 ₽/мес за пользователя.
❓ Частые вопросы
Чем &НаСервере отличается от &НаСервереБезКонтекста в управляемой форме?
&НаСервере получает доступ к реквизитам формы, но при каждом вызове платформа передаёт данные формы на сервер и обратно. &НаСервереБезКонтекста работает только с параметрами и не трогает форму, поэтому вызов легче. Для запросов и чтения данных почти всегда подходит именно он.
Почему внешняя обработка 1С работает медленно на сервере, хотя на локальной базе быстро?
Чаще всего клиентский код вызывает сервер внутри цикла. На локальной базе каждый вызов почти бесплатен, а по сети он стоит заметно, и цена умножается на число строк. Соберите данные в массив, передайте одним вызовом, выполните один запрос на сервере и верните результат целиком.
Что делать с ошибкой «Процедура или функция с указанным именем не определена»?
Проверьте две вещи. Серверная процедура не должна вызывать клиентскую: на сервере её нет. Метод модуля объекта, который вызывает форма, должен иметь слово Экспорт. Если причина в первом, пусть сервер возвращает результат, а вопрос пользователю или открытие формы выполняет клиентская процедура. После такой перестановки ошибка обычно уходит.
Сколько стоит исправить внешнюю обработку 1С?
Работа идёт по ставке сопровождения 1С: 3800 руб/час. Оценку в часах даём после просмотра кода и до начала работ, потому что объём зависит от числа форм и от того, как устроены вызовы сервера. Результат проверяем на копии рабочей базы, и только потом ставим в рабочую.
Что ломает внешние обработки при обновлении 1С?
Обработка, которая обращается к реквизитам типовых объектов, перестаёт работать, когда новый релиз конфигурации убирает или переименовывает реквизит. Платформа сообщает «Поле объекта не обнаружено». Перед обновлением прогоните обработки на копии базы, найдите обращения к изменённым реквизитам и поправьте их до перехода на рабочую базу.
Или позвоните: +7 906 045-28-27 — в рабочее время с 9:00 до 19:00
Остались вопросы? Нужна помощь?
Менеджеры компании с радостью ответят на ваши вопросы, произведут расчет стоимости услуг и подготовят индивидуальное коммерческое предложение.
Бесплатная консультация

