Прокси soap-сервер. Когда 1С не может в SOAP

Публикация № 965259

Разработка - Практика программирования

87
Думаю, многие сталкивались с проблемой "своеобразной" поддержки SOAP в 1с. То wsdl не парсится, то методы не вызываются, то xdto пакет толком не читается из-за вольностей (к слову, допустимых) в xsd. Ещё хуже дело обстоит, если в soap-сообщение нужно добавить заголовки - так называемые soap-headers, которые есть в стандарте soap 1.2, и которые конечно же не поддерживает 1С. Попробуем решить проблему и написать свой прокси-сервис "за 10 минут".

Вступление

Кто-то может сказать: "Ой, да что там руками формировать, XML простая". Однако протокол содержит некоторое количество расширений, таких как, например, WS-Addressing и WS-Security, которые могут превратить ручное формирование в боль.

На работе мне пришлось столкнуться с довольно замороченным soap-сервером, с которым не получалось легко работать из 1С. Сегодняшняя моя статья про то, как можно разработать легковесную прослойку между 1С и soap-сервером, принимающую в себя обычный http-запрос и перекладывающую содержимое в вызов soap-сервера. Естественно, код в статье максимально упрощен для простоты восприятия. Код работающего у меня production-решения сильно отличается от указанного примера и более «архитектурный» :).

Подготовка

В качестве инструмента для решения задачи я буду использовать node.js. Почему? Во-первых, мне так удобнее: я его знаю :). Во-вторых, на нем есть простые для запуска библиотеки для построения веб-приложений, работы с soap и кластеризацией. В качестве редактора я рекомендую использовать Visual Studio Code, но это уже дело вкуса. Тренироваться будем на классическом сервисе курсов валют.

После установки node.js в командной строке вам должна быть доступа утилита npm - пакетный менеджер для node.js. Для работавших с opm - это почти тоже самое, только для node.js и мощнее :).

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

После сразу установим все библиотеки, которые нам понадобятся для нашей прослойки с помощью команды:

npm install --save soap body-parser express

Файл с wsdl положим в корень каталога с именем DailyInfo.wsdl в кодировке UTF-8.

Для достижения нашей цели нам надо решить следующие задачи:

  1. Написать веб-сервер, который сможет принимать POST запросы (это совсем не так сложно, как звучит).

  2. Подключиться к soap-серверу как клиент.

  3. Преобразовать входящий POST-запрос в вызов soap-метода и вернуть на клиент результат.

Страшно? 10 минут, помните?

Реализация – веб-сервер

Создадим скелет нашего приложения - файл index.js в корневом каталоге (если вы не указывали иное при выполнении npm init) со следующим содержимым:

// express – фреймворк для построения веб-приложений
const express = require('express');
// Преобразователь тела сообщения к объекту JavaScript. Мы его будем
// использовать для автопреобразования сообщения с Content-Type
// application/json из собственно JSON в объект.
const bodyParser = require("body-parser");

// Объявление главной функции. Async-возможность нам понадобится чуть позднее.
async function main() {
    // Порт, который будет слушать веб-сервер
    const port = 3000;
    // Создание экземпляра веб-приложения
    const app = express();

    // Указание реагировать на POST-запрос
    app.post(
        "/",                // по «пустому» ресурсу
        bodyParser.json(),  // с автоматическим преобразованием json-содержимого
        (req, res) => {     // и выводом Привет, мир :)
            res.send("Hello, World");
        }
    );

    // Запуск приложения – указание слушать порт
    // и выводить сообщение в консоль по готовности
    app.listen(port, () => console.log(`Test app listening on port ${port}!`));
}

// Точка входа
main();

Этим небольшим скриптом мы сразу же решили задачу №1 из нашего списка. Осталось запустить и проверить.

Для запуска приложения у нас есть два варианта:

  • запуск из командной строки через node index.js;

  • запуск отладчика в VSCode.

С первым вариантом все просто: вбили в консоль и радуемся:

Останавливаем работу через Ctrl-C.

Отладчик VSCode запускается по кнопке F5. В выпадающем меню надо выбрать Node.js:

После выбора node.js на вкладке Debug console можно убедиться, что наше приложение запустилось и готово обрабатывать запросы:

Для проверки работоспособности я воспользуюсь чудесным инструментом отладки http-запросов Postman:

В ответе сервиса видим, что он не может обработать GET-запрос, что логично. Поменяем запрос на POST и получим уже ожидаемый ответ:

Реализация – soap-клиент

Перейдем ко второй части – подключение по soap-серверу в качестве клиента. Для этого в уже существующий файл нужно добавить два участка кода. В секцию подключения библиотек добавим подключение “soap” – библиотеки, с помощью которой можно как подключиться к чужому soap-серверу, так и опубликовать собственный.

const soap = require("soap");

Внутрь функции main добавим создание soap-клиента:

// создание soap-клиента на базе предварительно скачанной wsdl.
// В качестве параметра может выступать как адрес к файлу на диске,
// так и URL, по которому этот WSDL можно получить (прямо как WS-Ссылка)
const soapClient = await soap.createClientAsync("./DailyInfo.wsdl");
soapClient.setEndpoint("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx");

Иии… всё. Теперь через созданного клиента мы можем вызывать методы soap-сервера, как указанные с «полным» именем в виде soapClient,service.port.methodName(), так и по короткому soapClient.methodName().

Реализация – Преобразование запроса

Добавим, собственно, вызов нужного нам soap-метода. В качестве API нашего сервиса предлагаю такую простую схему: в теле POST-запроса передается JSON следующей структуры:

  • method – строка – имя вызываемого soap-метода;

  • body – произвольный – тело soap-запроса в виде js-объекта.

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

{
      "method": "GetCursOnDate",
      "body": { "On_date": "2018-01-01" }
}

Заменим наш ответ «привет, мир» на следующий код:

// Десериализованное тело запроса доступно в переменной req.body
// В случае корректного запроса req.body будет содержать два свойства:
// method и body

// Попробуем получить указатель на функцию для вызова soap-метода
const soapMethod = soapClient[req.body.method];

// Если метод не нашелся, выбросим исключение
if (soapMethod == undefined) {
    throw new Error("Wrong method name");
}

// Если все хорошо, вызовем soap-метод, передав ему в качестве параметров
// тело сообщения и обработчик результата вызова
soapMethod(req.body.body, (err, result) => {
    
    // В случае возникновения ошибки вернем ее клиенту.
    if (err) {
        res.send(err);
        return;
    }

    // Если все хорошо, переведем ответ в JSON и вернем клиенту.
    res.send(JSON.stringify(result));
});

Кода меньше, чем комментариев :). Сохраняемся, перезапускаемся и снова идем в Postman. На вкладке body укажем, что мы отправляем raw-данные с типом application/json и содержимым из примера выше:

В результате видим тело soap-ответа в виде JSON.

Реализация – вызов из 1С

Postman – это хорошо, но мы же изначально пришли с проблемой вызова из 1С. Выполнить обычный POST-запрос из 1С не составит труда, однако, я приведу пример реализации здесь, чтобы показать работу с JSON и XDTO.

Для начала добавим пакет XDTO в конфигурацию 1С. Если WSDL от поставщика soap-сервера читается, можно сразу добавить WS-ссылку. Сэмулируем проблему "нечитабельности" wsdl и добавим XDTO пакет вручную. В этом нам поможет знание о том, что WSDL содержит XSD для содержимого всех сообщений и методов.

Вытащим из WSDL все содержимое тега s:schema в отдельный файл и перенесем объявление пространства имен s из заголовка WSDL в заголовок нового файла. Получится что-то вроде такого:

Сохраним содержимое в файл с разрешением XSD, и, если все прошло успешно, полученная схема успешно импортируется в конфигуратор как XDTO пакет:

Если от вендора пришла «нечитаемая» в 1С XSD, то использование фабрики XDTO из следующего примера не имеет смысла, однако десериализацию из JSON будет просто написать по аналогии с сериализацией.

Для формирования запросов создадим внешнюю обработку со следующим кодом:

&НаСервереБезКонтекста
Процедура ВыполнитьЗапросНаСервере()

    // Создадим тело нашего запроса - параметры вызываемого soap-метода
    ТелоЗапроса = Новый Структура;
    ТелоЗапроса.Вставить("On_date", Дата(2018, 1, 1));

    // Сериализуем его в JSON
    ТекстСообщения = СериализоватьВJSON(ТелоЗапроса);

    // Проверим, что полученный JSON удовлетворяет XSD

    // Если бы у данного свойства был бы выделенный "тип объекта",
    // то мы бы могли получить тип проще...
    //ТипXDTO = ФабрикаXDTO.Тип(Метаданные.ПакетыXDTO.ПакетXDTO1.ПространствоИмен, "GetCursOnDate");

    КорневыеСвойства = ФабрикаXDTO.Пакеты.Получить(Метаданные.ПакетыXDTO.ПакетXDTO1.ПространствоИмен).КорневыеСвойства;
    СвойствоЗапросКурсовНаДату = КорневыеСвойства.Получить("GetCursOnDate");
    ТипXDTO = СвойствоЗапросКурсовНаДату.Тип;

    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТекстСообщения);

    // Если здесь не выдалось исключения, значит, пакет корректен и его можно отправлять.
    ФабрикаXDTO.ПрочитатьJSON(ЧтениеJSON, ТипXDTO); 

    // Создадим верхнеуровневую структуру, принимаемую промежуточным сервером
    СтруктураЗапроса = Новый Структура;
    СтруктураЗапроса.Вставить("method", "GetCursOnDate");
    СтруктураЗапроса.Вставить("body", ТелоЗапроса);

    // Сериализуем его в JSON для последующей отправки
    ТекстСообщения = СериализоватьВJSON(СтруктураЗапроса);

    // Создадим новое соединение с промежуточным сервером
    Хост = "localhost";
    Порт = 3000;
    Таймаут = 30;

    Соединение = Новый HTTPСоединение(Хост, Порт, , , , Таймаут);   

    // "Корневой" адрес ресурса, как мы его объявили в app.post
    Ресурс = "/";

    // Обязательно передаем тип содержимого для работы преобразователя body-parser
    ЗаголовкиЗапроса = Новый Соответствие();
    ЗаголовкиЗапроса.Вставить("Content-type", "application/json");

    // Создаем и отправляем запрос
    Запрос = Новый HTTPЗапрос(Ресурс, ЗаголовкиЗапроса);
    Запрос.УстановитьТелоИзСтроки(ТекстСообщения);

    Ответ = Соединение.ОтправитьДляОбработки(Запрос);   
    ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();

    // Десериализуем ответ сервиса из JSON в объект XDTO
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоОтвета);

    ТипXDTO = ФабрикаXDTO.Тип(Метаданные.ПакетыXDTO.ПакетXDTO1.ПространствоИмен, "GetCursOnDateResponse");
    Данные = ФабрикаXDTO.ПрочитатьJSON(ЧтениеJSON, ТипXDTO);

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

&НаСервереБезКонтекста
Функция СериализоватьВJSON(Объект)
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, Объект);
    ТекстСообщения = Запись.Закрыть();

    Возврат ТекстСообщения;
КонецФункции

&НаКлиенте
Процедура ВыполнитьЗапрос(Команда)
    ВыполнитьЗапросНаСервере();
КонецПроцедуры

Некоторые пояснения по коду.

Первое, за что может зацепиться взгляд – использование «обычной» ЗаписиJSON вместо ФабрикиXDTO. Причина тут довольно проста – ФабрикаXDTO умеет записывать произвольные типы, но с «мусорными» тегами “#value” и “#type” (тип добавляется, только если это указано явно в настройках записи). Наш промежуточный сервер ни про какие value ничего не знает. Выхода тут два – либо научить понимать сервер, либо использовать упрощенный сериализатор на базе структуры и записи. Выбор за вами.

Второе – пляски с бубном вокруг ФабрикиXDTO. Это всего лишь проверка валидности нашего сообщения. Мы же порядочные граждане, хотим быть уверены, что мы не шлем soap-серверу что-то, чего он не ожидает. В конкретно данном случае дополнительный реверанс пришлось сделать для получения типа создаваемого свойства, т. к. исходная wsdl вообще не содержит явных описаний типов значений, а только описания свойств с вложенными описаниями типов.

А вот чтение сообщения мы уже выполним «честной» ФабрикойXDTO для получения объекта XDTO и возможности работы в объектной модели.

Ставим в конец процедуры точку останова, выполняем обработку… Вуаля:

Цель достигнута!

Кластеризация

Окей, сервис готов, можно в прод? :)

Если не страшно, то можно сразу и в прод, однако, я бы на вашем месте помимо обработки ошибок и общего причесывания кода добавил бы еще одну вещь. Node.js штука хоть и быстрая, но не всемогущая. Возможно вам знакома фраза, что «нода – асинхронная, но однопоточная». В новых версиях node.js уже появилась честная поддержка многопоточности, но для простоты воспользуемся другим старым и проверенным механизмом – кластеризацией. А асинхронность обработки в нашем случае есть, но нам не помешает воспользоваться дешевым ускорителем.

Ставим пакет cluster-service с помощью команды:

npm install -g cluster-service

Запускаем наше приложение в командной строке, но в вместо node укажем приложение cservice:

Наш промежуточный сервис запустился в режиме кластера с количеством потоков, равным количеству логических процессоров. Можете выполнить нагрузочное тестирование через тот же SoapUI и замерить количество обрабатываемых запросов в секунду при обычном запуске и при кластеризованном запуске – заметите ощутимую разницу.

Что там было про WS-Addressing?

Ах-да, заголовки, те самые soap-headers, которые не поддерживает 1С. Добавить их довольно просто – для этого в soapClient есть метод addSoapHeaders, в который можно передать либо готовую строку с заголовками, либо JS-объект. Попробуем реализовать добавление пары заголовков семейства WS-Addressing, а именно Action и MessageID.

Для генерации UUID сообщения установим библиотеку uuid:

npm install --save uuid

Добавим ее в секцию импорта библиотек:

const uuidv4 = require("uuid/v4");

Между проверкой указателя на soap-метод и самим вызовом soap-метода добавим заполнение заголовков:

// Создадим объект для хранения заголовков
const wsaHeader = {
    MessageID: {
        // В качестве значения для заголовка MessageID сгенерируем случайный UUID
        $value: uuidv4()
    },
    Action: {
        // Для Action передадим имя вызываемого метода, как того требует протокол
        $value: req.body.method
    }
};

// Очистим заголовки soap-запроса
soapClient.clearSoapHeaders();

// Добавим новый заголовок
soapClient.addSoapHeader(
    wsaHeader,    // объект, в котором хранятся заголовки
    "WSA",        // имя группы заголовков
    "wsa",        // префикс пространства имен
    "http://www.w3.org/2005/08/addressing" // само пространство имен
);

Убедиться в корректности отправляемых заголовков можно через тот же SoapUI или настроив логирование запросов в промежуточном сервере.

Дополнительные вопросы

- А зачем JSON? Можно гонять туда-сюда XML?
- Можно, но зачем, если есть возможность гонять более легковесный JSON, а 1С уже умеет нативно с ним работать?

- Можно ли накрыть авторизацией?
- Можно, причем и веб-приложение (для этого надо добавить еще один middle-ware с авторизацией в вызов app.post), и soap-сервер, который можно поднять в этом же приложении как сервис обратного вызова в случае асинхронного soap-обмена.

Заключение

Вот таким нехитрым способом мы смогли обойти ограничение возможностей платформы 1С, таких как отсутствие поддержки soap-headers и не полной поддержки WSDL-описания.

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

Полный код получившегося приложения, а также исходники обработки доступны в репозитории на GitHub.

P.S. В процессе написания статьи я в очередной раз вспомнил, почему я так люблю TypeScript - за ошибки во время компиляции, типизацию и более умную контекстную подсказку. Если у вас еще остались силы, то в качестве домашнего задания можете повторить этот же пример на TypeScript, благо настроить единственный json-файл с конфигом можно тоже почти автоматически.

87

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. savostin.alex 63 19.12.18 04:31 Сейчас в теме
Можно как службу поднять:
nssm.exe install web-app "C:\Program Files\nodejs\node.exe" c:\http\index.js
Прикрепленные файлы:
nssm.exe
2. nixel 796 19.12.18 05:32 Сейчас в теме
(1) предпочитаю такие вещи упаковывать в докер.
zakiap; starik-2005; +2 Ответить
3. PLAstic 218 19.12.18 09:07 Сейчас в теме
А проблема была сложнее, чем просто обернуть наш пакет в soap:envelope? А то я выкрутился, скачав XSD SOAP, подгрузив в 1С и программно обернув достаточно красиво свой пакет в envelope. Про что мне надо почитать, чтобы проникнуться сложностями топикстартера? Мне кажется, хидеры так же добавляются обычным способом...

1С с жсоном работает просто мерзко, когда пытаешься его сериализовать по XDTO. Попробуйте выгрузить или загрузить пустой массив. Выгрузить - он никак не декларируется, загрузить - натыкаемся на баг платформы с одним только выходом - перезагрузить клиента. Платформенный "ПрочитатьJSON", конечно, парсит уже нормально пустые массивы, но получаем структуру.
4. nixel 796 19.12.18 09:35 Сейчас в теме
(3) хедеры добавляются не в soap:body, а в soap:headers. В моем случае мне нужно было реализовать ws-addressing и ws-security .X509 гостовскими сертификатами. В итоге body составляет примерно 5 процентов от итогового envelope, все остальное обрабатывалось на стороне прослойки.
5. PLAstic 218 19.12.18 09:43 Сейчас в теме
(4) Загружаем это в пакет XDTO, видим сразу Envelope:Header. Это не то?
Вроде похоже. Почитал про WS-addressing, сразу наткнулся на этот пакет. Грузим его в XDTO, добавляем нужные ссылки. Вроде всё?

Тут в 1.2 и в 7 указаны ссылки на все задействованные пространства имён.
A_Max; nixel; +2 Ответить
6. nixel 796 19.12.18 09:59 Сейчас в теме
7. nixel 796 19.12.18 10:00 Сейчас в теме
(5) но вообще любопытная идея - формировать соап сообщение напрямую через xdto. Спасибо, буду иметь ввиду.
9. nixel 796 19.12.18 12:27 Сейчас в теме
(4) и отдельно этот же сервис у меня выступает в роли коллбэка для асинхронного соап обмена с повышенными требованиями по высокой доступности, а 1с с её выводом на обслуживание для обновления тут не подходила.

В общем... Много было заморочек
8. N!ghtmare 19.12.18 11:21 Сейчас в теме
Еще как вариант,не "за 10 минут конечно", чтобы сохранить возможность валидации пакетов на стороне приемника, в проксе реализовать xslt преобразование. был практический опыт реализации на одном из проектов такой штуки на шарпе для интеграции с SAP PI.
в целом эта функция(xslt transoform) есть в большинстве esb -ей. и в WSO2 и в MULE. так же поддержка процессоров xslt есть в java и .net , нужно только обернуть и поднять на сервере приложения(Тomcat,IIS)

И на помечтать... В платформе было бы не плохо не сразу подавать сообщение на валидатор по опубликованному веб-сервису , а добавить возможность провести подготовительную обработку сообщения,дать возможность реализовать прокси внутри. Так же по внешней wsdl ссылке перед отправкой добавить возможность обработки отправляемого сообщения внешнему вебсервису. вот бы зажили тогда....
10. Fragster 929 19.12.18 12:33 Сейчас в теме
На хабре есть хорошая статья. Решается на 1с буквально в десяток строк, коотрые можно вынести в общий модуль и переиспользовать https://habr.com/post/313910/
11. DitriX 1713 19.12.18 13:39 Сейчас в теме
когда я столкнулся с этой проблемой - я не думал что это такая трагедия :)
Мы решили эту проблему за 10 минут, причем тупо средствами 1С.
Тут надо всего лишь понять, что SOAP - это протокол овер http, а это значит, что достаточно использовать http для тех же функций.
Поэтому просто берем работаем как с обычным SOAP - набираем боди как обычно, потом сериализуем его в xml, потом приклеиваем сверху хеадер и отправляем пост запрос.

Да, добавилось лишних 20 строк кода, зато четко все на 1С, универсально и без всяких проблем.
talych; artbear; Irwin; starik-2005; +4 Ответить
12. PLAstic 218 19.12.18 14:14 Сейчас в теме
(11) Т.е. колхозить потэгово? Я правильно понял?
13. DitriX 1713 19.12.18 14:16 Сейчас в теме
(12) Эммм... Не понял, в смысле - потегово? Делаете все как обчно, но в тот момент когда вы делаете вызов функции соапа - вы просто сериализуете параметры, которые вы бы передавали в соап, и отправляете через http. Ничего тут потегово не надо делать.
A_Max; Irwin; +2 Ответить
14. 987ww765 248 05.02.19 08:31 Сейчас в теме
(13) Вас не затруднит выложить пример? На словах я так и не догнал ваш вариант решения. Спасибо
15. DitriX 1713 05.02.19 13:58 Сейчас в теме
Простого примера нет, там все раскидано по куче модулей.
Но в двух словах так:
1. Получаем через соап опиание xdto
2. Создаем эти xdto и заполняем все как обычно, как будто мы хотим отправить через соап
3. Когда собрали все данные - берем этотм xdto пакет и сериализуем в xml
4. Берем расширение для хрома https://chrome.google.com/webstore/detail/wizdler/oebpmncolmhiapingjaagmapififiakb­ и набиваем тестовые данные
5. Смотри какой xml надо получить, и то что получили на этапе 3 - приводим к тому, что видим на этапе 4. Обычно - это добавление в начле и вконце тегов всяких. И обязательно смотрим заголовки.
6. Формируем http запрос, где пихаем заголовки и в тело - вот эту нащшу полученную строку
7. Получив ответ - десериализуем его, либо просто через фабрику, либо вычленяем тип и через него.
o.nikolaev; +1 Ответить
17. user883007 04.07.19 16:51 Сейчас в теме
(11) Добрый день!
А не могли бы Вы показать на примере более конкретно. Наш сервер не отвечает на HTTP запросы так, как на SOAP.
16. webester 29 05.02.19 15:17 Сейчас в теме
Чего я не понял, так это если вы поднимаете свой сервер который обрабатывает только ваши запросы. Зачем мудрить с передачей параметров? Передавайте нужные данные в теле запроса а уже скриптом пакуйте как надо?
18. user1250657 10.07.19 13:20 Сейчас в теме
Оставьте свое сообщение

См. также

Агрегатные функции СКД, о которых мало кто знает 316

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    9878    ids79    42       

Три костыля. Сказ про фокусы в коде 121

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    7736    YPermitin    67       

Отслеживание выполнения фонового задания 133

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    8163    ids79    14       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 241

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    10287    ids79    24       

Фоновое выполнение кода в 1С - это просто 117

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

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

02.08.2019    9739    avalakh    21       

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 126

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    9202    ids79    6       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 134

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования Разработка

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    8622    ids79    24       

Регистры сведений. За кулисами 113

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    6717    YPermitin    10       

"Меньше копипаста!", или как Вася универсальную процедуру писал 170

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    6181    SeiOkami    48       

Создание отчетов с помощью СКД - основные понятия и элементы 192

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    17321    ids79    16       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 176

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    11477    dmurk    134       

Регистры накопления. Структура хранения в базе данных 174

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    17164    YPermitin    27       

Выполнение внешней обработки в фоновом задании 147

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    9777    Eret1k    22       

Выгрузка документа по условию 5

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    4771    m-rv    2       

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    7301    m-rv    16       

О расширениях замолвите слово... 192

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    16291    ellavs    122       

Git-репозитории для 1С-кода (опыт использования при небольших проектах) 200

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    12659    ellavs    83       

Трюки с внешними источниками данных 164

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    12778    YPermitin    52       

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 162

Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    15382    ids79    9       

EnterpriseData – часть 2. Процесс выгрузки данных 127

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    12667    ids79    27       

Новый подход к обмену данными EnterpriseData 203

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    21328    ids79    72       

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации 118

Статья Программист Нет файла v8 v8::УФ БП3.0 УТ11 Россия Windows Бесплатно (free) Практика программирования Обмен через XML

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    18842    ids79    20       

Программное заполнение пользовательских параметров и отборов СКД 135

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    19531    Unk92    18       

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 126

Статья Программист Нет файла v8 v8::blocking 1cv8.cf Бесплатно (free) Математика и алгоритмы Практика программирования

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    20770    ids79    40       

Вспомогательные инструкции в коде 1С 104

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    20393    tormozit    100       

Произвольный код в фоновом режиме 164

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

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

03.09.2018    14537    nikita0832    41       

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 144

Статья Программист Нет файла v8 Россия Бесплатно (free) Математика и алгоритмы Практика программирования

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

23.08.2018    21168    Rain88    42       

Повышаем эффективность разработки правил обмена 123

Статья Программист Нет файла v8 КД ОС Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    19258    olegtymko    47       

Введение в механизм представлений в ЗУП ред. 3 153

Статья Программист Нет файла v8 v8::СПР ЗУП3.x Бесплатно (free) Практика программирования

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    24286    xrrg    82       

Как сделать запрос на изменение данных 75

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    21129    m-rv    21       

Строим графы средствами 1С (без GraphViz) 42

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    16923    slozhenikin_com    19       

Распределение расходов пропорционально продажам 9

Статья Программист Пользователь Нет файла v8 v8::ОУ УТ10 УУ Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Бесплатно (free) Практика программирования

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    11298    Rustig    9       

Просмотр временных таблиц запроса в отладчике без изменения кода 126

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

Данный способ можно использовать для просмотра содержимого временных таблиц запросов (менеджеров временных таблиц) без внесения изменений в код.

24.04.2018    24291    avfed@rambler.ru    19       

Минимализмы 3 351

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Универсальные функции

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    35498    ildarovich    44       

Этюды по программированию. Взаимодействие с Microsoft Word 109

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Часто приходится заниматься созданием сложных документов Word с таблицами, вложенными фрагментами, хитрым оформлением и прочими радостями жизни. Это - попытка как-то структурировать полученный опыт, чтобы не приходилось перерывать ворох старых обработок в поисках крупиц истины. Надеюсь, эта статья будет полезна и Вам.

11.12.2017    25793    milkers    23       

Метод формирования движений в типовых регистрах нетиповыми регистраторами 31

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    21270    itriot11    34       

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 720

Статья Программист Нет файла v8 КД Бесплатно (free) Перенос данных из 1C8 в 1C8 Практика программирования Обмен через XML

Что такое КД3? Как начать использовать? Полезные дополнения к документации. Что нужно исправить в типовых обработках и конфигурации. Как изменить правила обмена не снимая конфигурацию с поддержки. Как отлаживать правила обмена?

19.11.2017    137331    MaxS    251       

Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Код для заполнения данных по ИНН контрагента из ЕГРЮЛ с сайта огрн.онлайн.

01.11.2017    22645    slava_1c    49       

Программные перечисления, ч.2: приемы кэширования при разработке 66

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

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

30.10.2017    21012    unichkin    17       

Разбираемся с настройками компоновки данных 159

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Краткая шпаргалка по программной работе с настройками СКД

29.10.2017    23984    json    9       

Работа с Excel 288

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Собрал различные полезности для работы с Excel из 1С. Иногда приходится форматировать документ Excel программно из 1С. Так вот, чтобы не искать постоянно на просторах интернета как сделать левое выравнивание в ячейке Excel из 1С и т.п. решил опубликовать это...

23.10.2017    24584    arakelyan    39       

Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35) 143

Статья Программист Нет файла v8 v8::БУ БП3.0 Россия Бесплатно (free) Печатные формы документов Практика программирования БСП (Библиотека стандартных подсистем)

В статье https://infostart.ru/public/237013/ пользователя nick max рассматривался список действий для подключения команд печати в Бухгалтерии 3.0, работающей на БСП 2.3.6. В новом релизе Бухгалтерии 3.0.52.35 от 15.09.2017г. стала использоваться БСП 2.4.3, из-за чего произошли изменения в процедурах общих модулей, связанных с механизмом печати, и в процедурах их вызова в формах документов и в формах списков. Рассмотрим их.

18.09.2017    46687    bugtester    43