Соберите проект #
Выберите интересующую вас услугу
Меня интересует...

    Интеграция 1С с сайтом: зачем и как

    Интеграция 1С с сайтом: зачем и как
    13 мин.

      В статье описываем процедуру интеграции 1С, отвечаем на общие вопросы и даем практические советы программистам, которые будут работать с 1С.

      Что такое интеграция сайта с 1С

      1С — это семейство продуктов. Они различаются по версии платформы (7, 8.0, 8.1) и конфигурации (УТ, УПП, Бухгалтерия, ЗУП и др.). А интеграция — это передача данных между двумя системами. Интеграция характеризуется:

      • направлениями передачи —
      • система A → (или ←) система Б (односторонняя выгрузка/загрузка);
      • система A ↔ система Б (двусторонний обмен);
      • частотой обмена —
      • периодический обмен;
      • обмен в режиме реального времени;
      • полнотой обмена —
      • всегда полный;
      • обмен только изменениями.

      Чаще всего 1С интегрируются с корпоративными сайтами, различными сервисами или интернет-магазинами на разных cms.

      Какие сайты можно интегрировать с 1С

      Чаще предприятия заказывают следующие варианты интеграций.

      Интеграция интернет-магазина с 1С:УТ — выгрузка каталога номенклатуры в магазин и двусторонний обмен заказами в режиме реального времени.

      Интеграция Битрикс24 с 1С:УТ и 1С:Бухгалтерией — выгрузка заказов, счетов и контрагентов из 1С в Битрикс24.

      Трехсторонняя интеграция 1С, Битрикс24 и интернет-магазина — полная интеграция 1С одновременно и с магазином, и с Битрикс24. Для реализации этого сценария компания 1С-Битрикс выпустила версию "Битрикс24: Интернет-магазин". В нем магазин и CRM будут объединены, и интеграция снова станет двухсторонней.

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

      Интеграция абстрактного сайта с абстрактной 1С — это вариант, если ни один из вышеперечисленных не подошел.

      Стандартные возможности обмена 1С и Битрикса

      "Из коробки", когда не нужна ручная доработка, работают четыре обмена.

      1. Товары из 1С на сайт (тип "catalog").
      2. Справочники из 1С на сайт (тип "reference").
      3. Пользователей/контрагентов из 1С на сайт (тип "sale").
      4. Заказы (тип "sale"): из 1С на сайт и наоборот.

      Протокол

      Все взаимодействия между 1С и Битриксом проводятся по HTTP, синхронно. 1С, как и браузер, "открывает" специальную страницу, отправляет данные (методами POST и GET) и получает текстовый ответ. Существует вариант имитировать выгрузку из 1С браузером.

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

      Протокол синхронный. Это значит, что 1С отправляет следующий запрос на сайт только после получения ответа на предыдущий или ошибки таймаута.

      Формат

      Данные передаются в двух форматах.

      Формат 1. Текстовый, для ответов сайта на запросы из 1С. Сайт выводит в первой строке ответа:

      • "success", если завершил некую процедуру;
      • "progress", если продолжает ее выполнять;
      • "error" или "failure", если была ошибка.

      В зависимости от каждого конкретного запроса в последующих строках могут быть дополнительные данные.

      Формат 2. CommerceML 2. Он основан на XML. Подходит для передачи товаров, предложений, цен, складов, заказов и контрагентов.

      Алгоритм

      Подготовка к обмену

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

      Авторизация

      Запрос
      GET-параметры: type=<тип обмена>
      mode=checkauth
      Basic access логин: Логин сайта из настроек 1С
      Basic access пароль: Пароль сайта из настроек 1С
      Ответ
      Если успех: success <имя Cookie авторизации> <значение Cookie авторизации> sessid= <параметр1>=<значение1> <параметр2>=<значение2> ...
      Если ошибка: failure <текст ошибки>

      Любой обмен начинается с авторизации 1С на сайте методом Basic access. В случае успеха сайт выводит:

      • "success";
      • имя и значение Cookie (это он будет проверять во всех последующих запросах);
      • id сессии и прочие параметры (зависят от type — типа обмена).

      Возможные ошибки

      Текст ошибки Что делать
      Ошибка авторизации. Неверное имя пользователя или пароль. Проверить логин и пароль в Битрикс.
      У Вас нет прав для импорта каталога. Проверьте настройки компонента импорта. Проверить права пользователя в Битрикс.
      Ошибка проверки источника запроса. Обновите модуль обмена или отключите проверку в настройках компонента. Обновить модуль обмена в 1С или выполнить php-код на сайте: COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y"); COption::SetOptionString("sale", "secure_1c_exchange", "N").
      Модуль Информационных блоков не установлен. Проверить модуль iblock в Битрикс. Должен быть скачан и установлен.
      Включена смена идентификатора сессий. В файле подключения компонента обмена, до подключения пролога, определите константу BX_SESSION_ID_CHANGE: define('BX_SESSION_ID_CHANGE', false). Выполнить предложенное действие.
      Время на сервере базы данных отличается от времени на веб-сервере больше, чем на 10 минут. Вероятно, неправильно настроены временные зоны. Выполните настройку и повторите обмен. Проверить настройку часовых поясов на веб-сервере и на сервере БД.

      Запрос настроек сайта

      Запрос
      GET-параметры: type=<тип обмена>
      mode=init
      sessid=
      Cookie: <имя Cookie авторизации>=<значение Cookie авторизации>
      Ответ
      Если успех: zip= file_limit=<число>

      На этом шаге 1С узнает важные для обмена настройки сайта. Управление этими параметрами на сайте происходит на странице "Интеграция с 1С" в панели управления сайтом.

      Параметр Назначение Возможные значения
      zip Сайт умеет распаковывать zip-архивы. Если yes — 1С будет загружать файлы обмена в архивах, что сильно экономит время и трафик. yes no
      file_limit Максимально допустимый размер файла в байтах для передачи за один HTTP-запрос. Если системе 1С понадобится передать файл большего размера, они будут разбиты на несколько частей. целое число >= 0

      Получив эти параметры, 1С сформирует данные для передачи на сайт. Если "zip=yes", то все файлы будут переданы как zip-архив. Или каждый выгружается по отдельности. Желательно всегда включать zip.

      Возможные ошибки

      Текст ошибки Что делать
      Ошибка инициализации временного каталога При создании каталога для хранения файлов выгрузки произошла ошибка. Проверить права и путь для хранения файлов, или закончилось место на диске. По умолчанию сайт складывает файлы в папку /upload/1c_catalog/.

      Обмен товарами (1С -> Битрикс)

      Этот обмен (type=catalog) используется для создания и обновления на сайте сущностей:

      • инфоблок товаров;
      • UF-поля разделов в этом инфоблоке;
      • свойства элементов в этом инфоблоке;
      • инфоблок SKU;
      • типы цен;
      • склады;
      • разделы в инфоблоке товаров;
      • элементы в инфоблоке товаров (товары);
      • цены товаров;
      • наличие товаров по складам.

      При обмене товарами 1С формирует XML-файлы, передает их на сайт и контролирует их обработку сайтом. 1С может передать 4 вида файлов с префиксами:

      • import_ — разделы каталога, товары, свойства товаров;
      • offers_ — SKU;
      • prices_ — цены товаров и предложений;
      • rests_ — остатки товаров и предложений по складам.

      На шаге авторизации в случае успеха сервер вернет дополнительный параметр timestamp (текущее время). 1С сохранит timestamp и передаст на сайт на последнем шаге обмена товарами.

      Шаг 1. Передача файла (повторяющийся)

      Запрос
      GET-параметры: type=catalog
      mode=file
      filename=<имя файла>
      POST: Содержимое файла в виде строки
      Cookie: <имя Cookie>=<значение Cookie>
      Ответ
      Если успех: success
      Если ошибка: failure <текст ошибки>

      Шаг может выполняться несколько раз. Каждый файл выгружается частями не более file_limit байт в бинарном виде через сырой POST-запрос. Сайт создает файл, если его нет. Имя файла берет из GET-параметра filename и дописывает в него переданный контент. Так продолжается до тех пор, пока 1С не передаст все части этого файла.

      Возможные ошибки

      Текст ошибки Что делать
      Ошибка чтения HTTP данных Проверить сетевое соединение между сайтом и 1С.
      Ошибка открытия файла <имя файла> для записи Проверить права на файл и папку файла у пользователя apache, под которым работает Битрикс.
      Ошибка записи в файл <имя файла> Проверить права на файл и папку файла у пользователя apache, под которым работает Битрикс.

      Шаг 2. Основной

      Запрос
      GET-параметры: type=<тип обмена>
      mode=import
      sessid=
      filename=<имя файла>
      Cookie: <имя Cookie>=<значение Cookie>
      Ответ
      Если импорт завершен: success
      Если импорт продолжается: progress <текущий статус>
      Если ошибка: failure <текст ошибки>

      На этом этапе файл уже целиком загружен на сайт, и Битрикс готов его обработать. Обработка может состоять из 11 более мелких операций, о которых 1С ничего не знает. Поэтому в параметре GET приходит mode=import (один и тот же запрос!), но сайт выполняет совершенно разные операции.

      Текущий прогресс Битрикс сохраняет в сессии в переменной $_SESSION[BX_CML2_IMPORT][NS]. Например, узел STEP в этом массиве отвечает как раз за номер внутренней операции импорта.

      Шаг 2.1 Распаковка архива (повторяющийся, необязательный)

      Ответ
      Если файл распакован: progress Распаковка архива завершена.
      Если файл распаковывается: progress Идет распаковка архива.
      Если ошибка: failure <текст ошибки>

      Шаг исполняется, только если система 1С передала файл в формате ZIP. Распаковка происходит в той же директории, где лежат все файлы обмена товарами. По умолчанию это /upload/1c_catalog/. Эта операция не нумеруется внутри Битрикса. Значение STEP в сессии не изменяется).

      Возможные ошибки

      Текст ошибки Что делать
      Ошибка распаковки архива Проверьте работоспособность функции PHP zip_open и расширение Zip. Если все корректно — скачайте архив с сайта и проверьте его корректность вручную.

      Шаг 2.2 Удаление временных таблиц

      Ответ
      Если успех: progress Временные таблицы удалены.
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 0

      Работать напрямую с файлом XML неудобно и неэффективно. Поэтому все данные вносятся во временную таблицу b_xml_tree. На этом подготовительном шаге таблица b_xml_tree, если она существует, удаляется.

      Шаг 2.3 Создание временных таблиц

      Ответ
      Если успех: progress Временные таблицы созданы
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 1

      Таблица b_xml_tree создается. Если объявлена PHP константа BX_XML_CREATE_INDEXES_IMMEDIATELY, таблица сразу же индексируется. В конце этого шага Битрикс испускает событие OnBeforeCatalogImport1C.

      Возможные ошибки

      Текст ошибки Что делать
      Ошибка создания временных таблиц Проверить права и подключение СУБД

      Шаг 2.4 Загрузка файла во временную таблицу (повторяющийся)

      Ответ
      Если файл читается: progress Обработано <число>% файла.
      Если файл прочитан: progress Файл импорта прочитан.
      Если ошибка: failure <текст ошибки>
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 2

      Битрикс шаг за шагом начинает читать переданный из 1С файл, добавляя записи в таблицу b_xml_tree. Чтобы избежать проблем со временем исполнения, процесс происходит пошагово. Управление продолжительностью шага происходит на странице "Интеграция с 1С" в панели управления сайтом.

      Возможные ошибки

      Текст ошибки Что делать
      Ошибка открытия файла импорта. Проверить доступ к файлу.

      Шаг 2.5 Индексация временных таблиц

      Ответ
      Если успех: progress Временные таблицы проиндексированы.
      Если ошибка: failure <текст ошибки>
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 3

      Для повышения скорости работы импорта таблица b_xml_tree индексируется после прочтения файла.

      Возможные ошибки

      Текст ошибки Что делать
      Ошибка создания индекса для временных таблиц Возможная причина: проблемы с СУБД, правами в ней или подключением.

      Шаг 2.6 Импорт метаданных

      Ответ
      Если успех: progress Метаданные импортированы успешно.
      Если ошибка: failure Ошибка импорта метаданных <текст ошибки>
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 4

      На этом шаге создаются или обновляются следующие данные:

      • Инфоблоки товаров и SKU.
      • Служебные свойства каталога (с префиксом CML2_: CML2_BAR_CODE, CML2_ARTICLE, CML2_ATTRIBUTES…).
      • Торговый каталог.
      • Свойства инфоблоков.
      • UF-поля разделов инфоблоков.
      • Типы цен.
      • Склады.
      • Единицы измерения.

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

      Возможные ошибки

      Текст ошибки Что делать
      Отсутствует модуль "Торговый каталог". Импорт торговых предложений и цен невозможен. Пояснения не требуются.
      Ошибка создания типа информационных блоков. После этого сообщения следует текст ошибки API, который пояснит причину ошибки.
      Ошибка добавления новой единицы измерения (код единицы: <код>). Текст ошибки Битрикс не выведет, необходимо разобрать XML- файл самостоятельно и найти причину ошибки.
      Количество импортированных складов превышает разрешенное для данной редакции. Пояснения не требуются.
      Ошибка импорта пользовательского свойства (xml_id: <код>). Проверить параметры пользовательского свойства.
      Название справочника должно начинаться с буквы и состоять только из латинских букв и цифр. Пояснения не требуются.
      В выгрузке настроены цены с одинаковым названием. Продолжение обмена невозможно. Пояснения не требуются.
      В редакции "Малый Бизнес" нет возможности иметь более одного типа цены. Настройте выгрузку из 1С или перейдите на другую редакцию БУС. Пояснения не требуются.

      Шаг 2.7 Импорт разделов каталога

      Ответ
      Если успех: progress Группы импортированы
      Если ошибка: failure Ошибка импорта метаданных <текст ошибки>
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 5

      На этом шаге в инфоблоке создаются и обновляются все разделы каталога, которые были в XML- файле. Сопоставление разделов из XML-файла и в БД происходит по XML_ID.

      Если на сайте нет раздела с XML_ID из файла, он создается. Если есть, то выполняется сравнение полей из XML- файла с аналогичными полями в БД. Если изменения нет, то Битрикс только обновляет поле TIMESTAMP_X и пропускает раздел. Если изменения есть — происходит полноценное обновление. Это случается независимо от настроек сайта.

      Для экономии ресурсов сервера добавление разделов происходит без пересчета дерева (речь о полях LEFT_MARGIN и RIGHT_MARGIN).

      Возможные ошибки

      Так как импорт разделов не пошаговый, при обмене большого дерева разделов на сайте может возникать ошибка превышения времени исполнения. Решения три.

      1. Увеличить время исполнения на странице "Интеграция с 1С" и в настройках сервера (nginx).
      2. Доработать 1С, чтобы ошибки на этом этапе игнорировались, пока не будет получен ответ "progress".
      3. Повторить всю выгрузку несколько раз.

      Объясним, как поможет повтор шага или всей выгрузки. Допустим, в XML-файле и на сайте — 20001 раздел. Пусть за один проход Битрикс успевает импортировать только 10000 разделов.

      № Обмена/шага Пропущено т.к. нет изменений Обработано Ответ
      1 0 10000 Ошибка сервера.
      2 10000 10000 Ошибка сервера.
      3 20000 1 progress Группы импортированы.

      Битрикс каждый раз обрабатывает столько разделов, сколько успевает. При повторении выгрузки первые 10000 разделов он пропустит (обновит только TIMESTAMP_X) и обновит еще 10000 разделов, пока не наступил тайм-аут. И только на 3-ей выгрузке из 1С шаг будет завершен корректно.

      Шаг 2.8 Пересчет дерева разделов

      Ответ
      Если успех: progress Деактивация/удаление групп завершено
      Если ошибка: failure Ошибка импорта метаданных <текст ошибки>
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 6

      На этом шаге Битрикс выполняет две задачи.

      1. Удаление/деактивация разделов (в старых версиях модуля обмена в 1С).
      2. Перестройка дерева разделов.

      В старых версиях 1С отличить полную выгрузку от частичной просто: при частичной в узле "Классификатор" был атрибут СодержитТолькоИзменения="true", при полной его не было.

      1С выгружает этот атрибут. Если этого атрибута нет, Битрикс мог (и до сих пор может, просто этот код не используется) удалить, деактивировать старые разделы (или пропустить их). На выбор влиял параметр на странице "Интеграция с 1С". Сейчас эта настройка уже ни на что не влияет, и ни деактивации, ни удаления не происходит.

      Также на этом шаге пересчитываются служебные поля LEFT_MARGIN и RIGHT_MARGIN всех разделов.

      Шаг 2.9 Импорт товаров (повторяющийся)

      Ответ
      Если идет процесс импорта: progress Обработано <число> из <число> элементов
      Если импорт завершен: progress Загрузка элементов завершена
      Если ошибка: failure <текст ошибки>
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 7
      DONE Ассоциативный массив, счетчик обработанных товаров и всех товаров в файле

      На этом шаге в инфоблоке создаются и обновляются все товары, которые были в XML-файле. Сопоставление товаров в файле товарам на сайте происходит по полю XML_ID.

      Если на сайте нет товара с XML_ID из файла, он создается. Если есть, то выполняется сравнение полей из XML-файла с аналогичными полями в БД.

      Если изменения нет, и задан параметр "Использовать контрольные суммы элементов для оптимизации обновления каталога", Битрикс только обновляет поле TIMESTAMP_X и пропускает товар. Иначе происходит полноценное обновление.

      При импорте товара заполняется поле TMP_ID. Значение для этого поля хранится в узле <НомерВерсии>. Если узла нет — Битрикс вычисляет контрольную сумму от всей информации о товаре из XML-файла.

      Возможные ошибки

      Текст ошибки Что делать
      Временная таблица не существует Ошибка возникает, если с сайтом работает несколько 1С или одна 1С присылает несколько запросов одновременно. В одном потоке выполняется шаг 4.9, а другой запустил шаг 4.2.

      Шаг 2.10 Деактивация/удаление товаров (повторяющийся)

      Ответ
      Если идет обработка: progress Обработано <число> из <число> элементов.
      Если обработка завершена: progress Деактивация/Удаление элементов завершены.
      Если ошибка: failure <текст ошибки>
      Сессия ($_SESSION[BX_CML2_IMPORT][NS])
      STEP 8
      DONE Ассоциативный массив, счетчик обработанных товаров и всех товаров в файле.

      На этом шаге Битрикс деактивирует все товары и разделы каталога, не затронутые в текущей сессии. Для этого время последнего изменения сравнивается с timestamp, который передает 1С — время начала текущей сессии, полученное на шаге авторизации.

      Напомним, что эти настройки в панели управления сайта сейчас ни на что не влияют.

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

      Ш аг 3. Завершение импорта

      Запрос
      GET-параметры: type=<тип обмена>
      mode=complete
      sessid=
      Cookie: <имя Cookie>=<значение Cookie>
      Ответ
      Если успех: success Завершение процедуры импорта.
      Если ошибка: failure <текст ошибки>

      Служебный шаг. Обработки данных нет, только испускается недокументированное событие модуля catalog OnCompleteCatalogImport1C. Аргументы обработчика аналогичны обработчикам события OnSuccessCatalogImport1C, возвращаемого значения нет.

      Обмен справочниками (1С -> Битрикс)

      Данный тип обмена (type=reference) используется для создания и обновления на сайте HL-блоков. Этот тип намного короче, чем обмен товарами, и повторяет многие из его шагов.

      Часто обмен справочниками — простой и быстрый способ расширить стандартные функции обмена.

      Шаг 1. Передача файла (повторяющийся)

      Этот шаг, аналогичный шагу обмена товарами, отличается только mode, в данном типе обмена mode=reference.

      Шаг 2. Основной

      Запрос
      GET-параметры: type=reference
      mode=import
      sessid=
      Cookie: <имя Cookie>=<значение Cookie>

      Шаг 2.1 Распаковка архива (повторяющийся, необязательный)

      Аналогичный шаг обмена товаров.

      Шаг 2.2 Подготовка справочника

      Ответ
      Если успех: progress Найден или создан справочник. Код справочника:
      Если ошибка: failure <текст ошибки>

      На этом шаге Битрикс создает HL-блок (если не существует) и все UF-поля. В начале шага испускается событие модуля catalog OnBeforeCatalogImportHL. Событие недокументированное, в обработчики передаются массив параметров компонента и путь к XML-файлу. Обработчик может вызвать ошибку и вернуть произвольное сообщение.

      Важно знать следующие особенности импорта справочников:

      • 1С не может удалить справочник или поле, только создать;
      • 1С может создать только поля следующих типов — Строка, Булево, Дата, Число;
      • все поля, создаваемые 1С, будут одиночными, необязательными, скрытыми в фильтре, показанными и редактируемыми в таблице;
      • Битрикс автоматически создает поля — UF_NAME, UF_XML_ID, UF_VERSION, UF_DESCRIPTION.

      Возможные ошибки

      Текст ошибки Что делать
      Ошибка при создании поля в справочнике <Текст ошибки> Изучить текст и исправить в 1С или на сайте.
      Ошибка при создании справочника <Текст ошибки> Изучить текст и исправить в 1С или на сайте.
      Ошибка разбора XML. Код ошибки: <Код ошибки> Расшифровать код и исправить в 1С или на сайте.

      Расшифровка кодов ошибок

      Код Объяснение
      10 Неизвестная ошибка парсинга XML-файла.
      20 Невалидный XML-файл.
      110 В XML-файле отсутствует или пустой узел <Ид> справочника.
      120 В XML-файле отсутствует или пустой узел <Наименование> справочника.
      210 Во время импорта UF-полей не был найден higloadblock.
      220 В XML-файле отсутствует или пустой узел <Ид> в <Реквизит>.
      230 В XML-файле отсутствует или пустой узел <Наименование> в <Реквизит>.
      240 Неизвестный <ТипЗначений> в узле <Реквизит> (допустимы только: Строка, Булево, Дата, Число).
      250 Неизвестная ошибка при создании UF-поля highload-блока.
      310 Во время создания элементов справочника не был найден higloadblock.
      320 В XML-файле отсутствует или пустой узел <Ид> в <ЭлементСправочника>.
      330 В XML-файле отсутствует или пустой узел <ЗначениеРеквизита> в <ЗначенияРеквизитов> в <ЭлементСправочника>.

      Шаг 2.3 Импорт элементов (повторяющийся)

      Ответ
      Если импорт завершен: success Импорт успешно завершен.
      Если импорт в процессе: progress Импортировано элементов: <число>
      Если ошибка: failure <текст ошибки>

      На этом шаге Битрикс импортирует все элементы HL-блока.

      Если выгрузка была полной, Битрикс удаляет все элементы HL-блока, у которых значение поля UF_VERSION не начинается с + "#"

      В конце шага Битрикс испускает событие модуля catalog OnSuccessCatalogImportHL. Аргументы — массив параметров компонента и путь к файлу.

      Возможные ошибки аналогичны ошибкам в предыдущем шаге.

      Формат файлов

      Приводим ссылки на официальную документацию Битрикса.

      • Формат файла обмена товарами.
      • Формат файла обмена предложениями.
      • Формат файла обмена ценами товаров и предложений.
      • Формат файла обмена остатками товаров и предложений.
      • Формат файла обмена справочниками.

      Заключение

      Интеграция с 1С часто — самая сложная задача в процессе разработки. Хорошее понимание процессов необходимо для улучшения навыков любого специалиста и работы над серьезными проектами.

      Продолжая пользоваться сайтом, я даю согласие на использование файлов cookie.