Как правильно перенести конфигурацию 1С на обычных формах с файловой версии на серверную?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Переход с файлового варианта работы базы данных на клиент-серверный — это стандартный этап роста любой системы автоматизации. Однако для начинающего разработчика, работающего с классическими конфигурациями (такими как Управление торговлей 10.3), этот процесс может вызвать опасения. Основной вопрос заключается в том, нужно ли переписывать код под управляемые директивы и какие скрытые ошибки могут возникнуть при слиянии доработок с рабочей базой клиента. Разберем эту ситуацию подробно, проанализируем технические нюансы и составим пошаговый план безопасного перехода.

Различие в архитектуре: Толстый клиент и сервер

Для начала проясним важный момент: в конфигурациях на «обычных формах» (как в вашем случае с УТ 10.3) использование директив &НаКлиенте и &НаСервере не является обязательным и зачастую даже невозможно в рамках классического интерфейса. Эти конструкции относятся к «управляемому приложению». В «толстом клиенте» код по умолчанию имеет доступ ко многим ресурсам, но при переходе на серверную версию правила игры меняются.

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

Проблема мутабельных значений и сериализации

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

Мутабельные значения (изменяемые объекты) — это такие типы данных, которые нельзя однозначно передать «как есть» между процессами. К ним относятся:

Если в вашем коде процедура на сервере пытается вернуть клиенту ТаблицаЗначений напрямую (в качестве параметра или результата функции), серверная база выдаст критическую ошибку. Проанализируем пример кода, который будет работать в файловой базе, но упадет в серверной:


// В файловой базе это сработает, в серверной — нет
Процедура ОбработатьДанныеНаСервере(МояТаблица) Экспорт
    // Какие-то действия с таблицей
КонецПроцедуры

Чтобы избежать этой проблемы, данные необходимо преобразовывать в неудаляемые/неизменяемые типы, такие как Массив (состоящий из структур) или Структура, либо использовать временное хранилище.

Настройка свойств общих модулей

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

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

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

Доступ к файловой системе и права USR1CV8

Выясним, почему внешние файлы (Excel, картинки, логи) могут перестать открываться. В файловой базе 1С работает от имени текущего пользователя Windows. В серверной версии код, исполняемый на стороне сервера, работает от имени специальной учетной записи (обычно это USR1CV8 или 1CV8).

Посмотрим на типичные проблемы:

Разрядность систем и внешние компоненты

Если вы разрабатывали код на 32-битной версии 1С, а клиент использует 64-битный сервер (что сейчас является стандартом), могут возникнуть проблемы с внешними компонентами (DLL). Разберем ситуацию: драйвер сканера штрих-кода или компонента печати этикеток, написанная под 32 бита, просто не загрузится в 64-битном серверном процессе. В этом случае код нужно выносить строго на сторону клиента, где приложение остается 32-битным.

Использование временных таблиц в запросах

Проанализируем работу с объектом МенеджерВременныхТаблиц. В клиент-серверном режиме менеджер временных таблиц живет строго в рамках одного соединения. Если ваша логика подразумевает создание временной таблицы в одном модуле и попытку прочитать ее в другом через некоторое время (при этом происходит разрыв контекста между клиентом и сервером), таблица будет пуста. Старайтесь завершать работу с временными таблицами в рамках одного вызова сервера.

Безопасная стратегия объединения конфигураций

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

  1. Синтаксическая проверка: В конфигураторе откройте вашу доработанную конфигурацию. Выполните команду «Сервис» — «Параметры» — «Запуск 1С:Предприятия» — «Основные» и убедитесь, что выбрано «Толстый клиент». Затем запустите «Текст» — «Проверить синтаксис». В окне проверки обязательно отметьте галочками пункты: Сервер, Толстый клиент (обычное приложение), Внешнее соединение. Это позволит выявить 90% проблем с недоступными функциями до момента загрузки в базу.
  2. Создание тестовой серверной базы: Не объединяйте код сразу с рабочей базой. Попросите у клиента выгрузку (файл .dt), разверните её у себя на локальном сервере (можно использовать бесплатный SQL Express). Проверьте работоспособность всех функций именно в серверном режиме.
  3. Логирование ошибок: Если база на сервере ведет себя странно, используйте Журнал регистрации. Многие ошибки сервера не выводятся пользователю на экран в виде привычных окон, а просто тихо записываются в журнал или прерывают транзакцию.

Помните, что для УТ 10.3 переход на сервер обычно проходит гладко, если вы не увлекались передачей огромных таблиц значений между общими модулями. Главное — следить за тем, чтобы серверный код не пытался вызвать диалоговые окна (интерактивные действия) и имел права на доступ к нужным файлам.

← На главную