Применение средств MS SQL R service для 1С

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

Разработка - Системная интеграция - Внешние источники данных

MS SQL сервер R Python

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

Думаю, что Python не нуждается в представлении, а вот про R возможно кто-то и не слышал. Если коротко, то данные ЯП обладают огромным количеством свободно распространяемых библиотек на все случаи жизни, и поддержка их сервером MS SQL, на мой взгляд, предоставляет разработчикам новые возможности, особенно в части работы с big data, статистикой, анализом данных и т.п. В данной статье будут описаны только начальные принципы использования связки 1С-SQL-R. В дальнейшем, возможно, доберемся и до Python, но R, на данный момент, я знаю гораздо лучше и поэтому все примеры будут именно на данном языке.

1. Установка и настройка необходимых программ

Для начала необходимо установить SQL server с необходимыми дополнениями. На установке подробно останавливаться смысла нет, все стандартно и подробно расписано в msdn. С поддержкой R от MS не все прозрачно - для применения непосредственно из SQL нам нужна версия R in-database server. Имеются ещё варианты standalone - отдельной установки сервера machine learning и просто дистрибутив R open. У каждого продукта свое предназначение, свои версии R, свои пути установки - тут важно не запутаться и следить, например, за тем из под какой версии R и куда вы устанавливаете дополнительные пакеты. 

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

EXEC sp_configure 'external scripts enabled', 1

Рестартуем SQL server и проверяем, что все сделали правильно

EXEC sp_execute_external_script  @language = N'R',
@script = N'
OutputDataSet <- InputDataSet;',
@input_data_1 = N'SELECT 1 AS hello'
WITH RESULT SETS (([hello] int not null));
GO

Результат должен быть следующим:

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

Переходим к практике.

2. Постановка тестовой задачи

Выше уже я описал в качестве большого плюса R огромное количество библиотек. Так же у R имеется простая и удобная IDE R Studio. Считаю ее не заменимым и почти идеальным инструментом, хотя для наших задач будет достаточно стандартной консоли R.

Задача не сложная - для теста с некоторыми допущениями и условностями: предположим имеется УТ 11.х и справочник номенклатуры. Требуется загрузить в базу большое количество новой номенклатуры из какого-либо внешнего источника данных, при этом определить наличие пересечений по наименованию или просто найти и сопоставить свою номенклатуру с номенклатурой поставщика. Попробуем реализовать это с помощью R и MS SQL. 

Задача сводится к обработке двух таблиц данных, для упрощения допустим следующую структуру:

Искомые данные - два столбца: код или порядковый номер (целочисленный, не отрицательный) и наименование товара (строка). В дальнейшем типы будут важны, т.к. будем писать все в таблицу БД

Каталог номенклатуры для поиска - код, имя, описание, вид номенклатуры: типы кода, имя и описания соответствуют типам MS SQL для справочника номенклатуры 1С, а вид номенклатуры пусть будет выведен строкой (для упрощения, т.к. если хотим иметь ссылку, то придется передавать в скрипт строку, а в обратном направлении  преобразовывать обратно в varbinary). 

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

Перейдем к написанию и объяснению кода на R. При этом целью не является обучение языку и это абсолютно не возможно в рамках одной статьи, но основы постараюсь расписать и код прокомментировать подробно. 

Сначала нам надо установить дополнительные пакеты, packages, ибо без них использование R теряет смысл. Открываем Rgui, который находится где-то в районе [Program Files]\Microsoft SQL Server\[НазваниеВашегоЭкземпляраСервераСкуль]\R_SERVICES\bin\[ВашаРазрядность]\Rgui.exe (можно открыть R Studio с настройками применения данного экземпляра R) и вводим следующий код:

install.packages(c("dplyr", "stringdist"))

Таким нехитрым образом мы установили два пакета: dplyr, без которого ну просто никуда, используется для работы с типом data.frame (в переводе на язык 1С - таблица значений), и stringdist, в котором имеются различные метрики для сверки строк. 

Проверим список установленных пакетов

EXECUTE sp_execute_external_script
@language=N'R'  
,@script = N'str(OutputDataSet);  
packagematrix <- installed.packages();  
OutputDataSet <- as.data.frame(packagematrix[, 1]);'  
,@input_data_1 = N'SELECT 1 as col'  
WITH RESULT SETS ((PackageName nvarchar(250)))
 
 Пояснение кода и ещё один пример на R

 Тут мы получаем список установленных пакетов встроенной функцией R. Эта функция возвращает объект класса matrix из которого нас интересует первая колонка. Вернуть нам надо таблицу данных типа data.frame, поэтому используем соответствующую функцию преобразования в данный тип. В последней строке с помощью конструкции WITH RESULT SETS мы типизируем и именуем колонки полученного из внешнего скрипта результата (это не обязательно, но для дальнейшей работы с результатом незаменимо да и просто не красиво в продакшне)

Для тех, кто мало знаком с R ещё один примерчик: вот тут мы получим таблицу данных с двумя колонками. Функция с() в примере формирует вектор строкового типа с названиями нужных нам колонок.

EXECUTE sp_execute_external_script
@language = N'R'  
,@script = N'str(OutputDataSet);  
packagematrix <- installed.packages();  
OutputDataSet <- as.data.frame(packagematrix[, c("Package", "Version")]);'  
WITH RESULT SETS ((PackageName nvarchar(250), PackageVersion nvarchar(20)))

Увидим ожидаемый вывод:

Если все работает и виден результат, то можно переходить к следующей части.

3. Запросы SQL

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

Итак составим простейший прямой запрос к справочнику номенклатуры. Прямой запрос составляем кто как привык - через стандартную консоль запросов или руками, глядя в описание структуры хранения СУБД или же через профайлер MS SQL. 

 
 Простой прямой запрос
SELECT Items._Code AS Code
	  ,Items._Description AS Name
      ,Items._Fld5586 AS Description
	  ,Kind._Description AS Kind
	  ,NULL AS ItemName
	  ,0 AS ItemNum	  
	FROM [ut_demo].[dbo].[_Reference215] AS Items
	LEFT JOIN [ut_demo].[dbo]._Reference76 AS Kind
	ON Items._Fld5567RRef = Kind._IDRRef

 

Получим таблицу с наименованием и кодом номенклатуры, ее описанием, и наименованием вида номенклатуры (просто для дополнительной информации)

4. Скрипты на R, sp_execute_external_script

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

DECLARE @par1 int = 2, @par2 int = 3    -- Добавляем переменные со значениями 1 и 2
EXECUTE sp_execute_external_script      -- Объявляем начало внешнего исполняемого скрипта
@language=N'R'                          -- Указываем язык скрипта
,@script = N'                            # А тут уже комментарии на R
q1 <- Q_in[1,1]                          # Это исходные данные, всегда типа data.frame 
                                         # В данном примере получаем значение первой ячейки таблицы
q2 <- q_1;                               # А это первый входной параметр
q3 <- q_2;                               # А это второй
QQ <- data.frame(Q = c(q1, q2, q3));     # Составили список и привели его к типу data.frame, и возвращаем из скрипта результат
' 
,@input_data_1 = N'SELECT 1 as col'     -- Передаем в скрипт результат этого сложнейшего запроса
,@input_data_1_name = N'Q_in'           -- Задаем наименование по которому будем обращаться в скрипте за входными данными
,@output_data_1_name = N'QQ'            -- Задаем наименование для возвращаемых из скрипта данных
,@params = N'@q_1 int, @q_2 int'        -- Задаем наименования параметров, в данном примере их два
,@q_1 = @par1                           -- Значение первого параметра
,@q_2 = @par2                           -- Значение второго параметра
WITH RESULT SETS ((Q int))              -- Тип и наименования результата

При решении подобной задачи возникает вопрос: нам же надо сравнивать одну таблицу (наименования товаров) с данными, полученными на прошлом этапе прямым запросом. Как нам передать в скрипт наши искомые данные? Поиск в интернете дает следующий ответ: пока никак. И цифра 1 в "input_data_1" никого не должна вводить в заблуждение, т.к. "input_data_2" не существует, так же как и не существует всех последующих "input_data_N". Конечно это неприятность, но маленькая. Вариантов обойти эту проблему несколько. В случае небольших наборов искомых данных вполне можно передать строковой параметр, например записать данные в формат json, с которым R прекрасно дружит (пакет jsonlite). Можно подключаться из самого R к базе данных (т.е. внутри скрипта), что, на первый взгляд, не совсем красиво выглядит и требует отдельного изучения.

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

Подготовим базу данных и таблицу для хранения сравниваемой номенклатуры. 

 
 Создадим служебную таблицу

 Запрос на создание служебной таблицы примерно такой

CREATE TABLE [integration].[dbo].[itemstofind](
	[id] [int] NOT NULL IDENTITY(1,1),
	[ItemName] [nvarchar](100) NULL,
	[ItemNum] [int] NULL,
	[Value] [int] NULL,
	[Code] [nchar](11) NULL,
	[Name] [nvarchar](100) NULL,
	[Description] [nvarchar](1024) NULL,
	[Kind] [nvarchar](100) NULL
	CONSTRAINT PK_ID PRIMARY KEY(id)
) 

 

4. Алгоритм поиска строк

Для поиска строк будет использоваться пакет stringdist. У данного не большого пакета есть несколько вариантов определения похожести строк. После некоторых тестов была выбрана метрика Жаро-Винклера

На R это будет выглядеть так:

stringdist("MARTHA", "MARHTA", method = 'jw', p = 0.1)

Первые два параметра - две строки, или строка и список строк, для определения "степени похожести". Вторым параметром указываем, что нам нужна именно метрика Жаро-Винклера. p - служебный параметр самого алгоритма. Схожесть в реализации алгоритма на R для одинаковых слов равна 0, для различных стремится к 1 (в алгоритме на вики наоборот)

Примеры:

> stringdist("MARTHA", "MARHTA", method = 'jw', p = 0.1)
[1] 0.03888889
> stringdist("DWAYNE", "DUANE", method = 'jw', p = 0.1)
[1] 0.16

Метод регистрозависим:

> stringdist("dWAYNE", "DUANE", method = 'jw', p = 0.1)
[1] 0.3
> stringdist("dWaYne", "DUANE", method = 'jw', p = 0.1)
[1] 1

5. Реализация через хранимые процедуры

Используем stored procedures в MS SQL для удобства использования алгоритма. 

 
 Код создания хранимой процедуры
USE [integration]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[CompareItems] 	
	@quant int
	
AS
BEGIN
EXEC	 
	  sp_execute_external_script
      @language = N'R'
    , @script = N'
        # Подключаем библиотеки
        library(dplyr);
		library(stringdist);

        # Функция, для получения q минимальных совпадений с искомой строкой
		get.res <- function(items.list, items.cat, q){
			cat.names <- items.cat$Name;
			item.name <- items.list[1];
			item.num <- items.list[2];
            
            # Функция сравнения "похожести" строк
			m <- stringdist(items.list[1], as.character(items.cat$Name), method = "jw", p = 0.1);
            
            # Приводим результат к чистому виду, удаляем мусор, сортируем
			res <- as.data.frame(cbind(m, items.cat)) %>%
					rename(Value = m) %>%
					filter(tolower(Value)!="inf"&!is.na(Value)&!is.infinite(Value)) %>%	
					mutate(ItemName = item.name, ItemNum = item.num) %>% 				
					arrange(Value);

            # Возвращаем первые q строк
			head(res, q)
		}
		        	
        # Формируем объект для поиска из входных данных	
		i.list <- items_cat %>%
		filter(ItemNum > 0) %>%		
		select(ItemName, ItemNum) %>%
		mutate(ItemName = tolower(as.character(ItemName)))
 
        # Формируем данные среди которых происходит поиск
		i.cat <- items_cat %>%
		filter(ItemNum == 0) %>%
		select(Code, Name, Description, Kind) %>%
		mutate(Name = tolower(as.character(Name)))
  
        # Для каждой строки датафрэйма искомых данных применяем функцию поиска
		mres <- apply(i.list, 1, get.res, items.cat = i.cat, q = quant)		
       
        # Соединяем полученные результаты для возврата из скрипта
		OutputDataSet <- do.call("rbind", mres);'
    , @input_data_1 = N'
	SELECT Items._Code AS Code
	  ,Items._Description AS Name
      ,Items._Fld5586 AS Description
	  ,Kind._Description AS Kind
	  ,NULL AS ItemName
	  ,0 AS ItemNum	  
	FROM ut_demo.dbo._Reference215 AS Items
	LEFT JOIN ut_demo.dbo._Reference76 AS Kind
	ON Items._Fld5567RRef = Kind._IDRRef
	UNION ALL
	SELECT Code, Name, Description, Kind, ItemName, ItemNum FROM integration.dbo.itemstofind;'
	, @input_data_1_name = N'items_cat'
	, @output_data_1_name = N'OutputDataSet' 
	, @params = N'@quant int'    
	, @quant = @quant
	WITH RESULT SETS ((Value real, Code [nchar](11), Name [nvarchar](100), Description [nvarchar](1024), Kind [nvarchar](100), ItemName [nvarchar](100), ItemNum int));
END

 Комментарии добавил в сам код на R

 В SQL quant - параметр, количество записей, наиболее близких по алгоритму распознавания, которые мы хотим получить по каждой строке поиска.

Заполним тестовые данные для поиска

Проверим работоспособность запросом в SQL

DECLARE	@return_value int
EXEC	@return_value = [dbo].[CompareItems]
		@quant = 5

Результат на демобазе УТ 11:

6. Код в 1С

Напишем обработку для тестирования. Код в 1С подробно расписывать не хочется, т.к. статья не об этом и примеров в инете море. Но и совсем без кода на 1С наверное нельзя. 

 
 1С код

ТоварныеПозиции - ТЗ с реквизитом Наименование. При создании формы заполняем нужным набором данных для поиска

Подключаемся к БД. Не забываем про права пользователя на используемые БД в MSSQL.

	
	СтрокаПодключения = "DRIVER={SQL Server};
	|SERVER=XXX;
	|UID=XXX;
	|PWD=XXX;
	|DATABASE=integration";
	
	Connection = Новый COMОбъект("ADODB.Connection");
	Command    = Новый COMОбъект("ADODB.Command");
	RecordSet  = Новый COMОбъект("ADODB.RecordSet");

	Попытка
		Connection.Open(СокрЛП(СтрокаПодключения));
		Command.ActiveConnection   = Connection;		
		Command.CommandText = "select * from sys.databases where name = 'integration'";
		RecordSet = Command.Execute();
		
		Если RecordSet.EOF() И RecordSet.BOF() Тогда
			Возврат;
		КонецЕсли;
		RecordSet.MoveFirst();
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки; 

Чистим таблицу и записываем данные, которые ищем. Запись лучше делать порциями для больших объемов данных.

// Почистим табличку скуля
	Command.CommandText = 
	"USE integration
	|TRUNCATE table dbo.itemstofind";		
	Command.Execute();
	
	// Поместим в таблицу нужные нам данные
	мСчет = 1;
	мТекст = "USE integration
	|INSERT INTO dbo.itemstofind (ItemName, ItemNum) VALUES";

	Для Каждого Стр Из ТоварныеПозиции Цикл
		мТекст = мТекст + "
		|('" + Строка(Стр.Наименование) + "',
		|" + Формат(мСчет, "ЧРД=.; ЧН=0; ЧГ=0") + "),";		
	КонецЦикла;	
	
	Command.CommandText = Лев(мТекст, СтрДлина(мТекст) - 1) + ";";	
	Command.Execute();

Обращаемся к хранимой процедуре

	// дернем процедуру
	Command.CommandText = 
	"USE [integration]
	|SET NOCOUNT ON
	|DECLARE	@return_value int
	|EXEC	@return_value = [dbo].[CompareItems]
	|		@quant = 5
	|";
	RecordSet = Command.Execute();
	
	Пока RecordSet <> Неопределено Цикл
		Если RecordSet.Fields.Count > 0 Тогда
			RecordSet.MoveFirst();
			
			COMSafeArray = RecordSet.GetRows(); 
			Array = COMSafeArray.Unload(); 
			Для i = 0 По Array.UBound() Цикл
				strArray = Array[i]; 
				
				Если strArray.Count() < 2 Тогда 
					Продолжить;
				КонецЕсли;
				
				НовСтр = РезультатТест1.Добавить();
				
				НовСтр.Наименование = strArray[5];
				НовСтр.Код 			= strArray[1];
				НовСтр.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(НовСтр.Код);
				НовСтр.ЗначениеПоказателя = strArray[0];					
			КонецЦикла; 
		КонецЕсли;
		RecordSet = RecordSet.NextRecordSet();
	КонецЦикла;
	
	Command = Неопределено;
	Connection = Неопределено;
	RecordSet = Неопределено; 

Осталось лишь прочитать ответ и записать куда надо. Или вывести на форму.

Берем первые 10 записей справочника номенклатуры. Заполняем таблицу ТоварныеПозиции.

Вот это мы ищем:

А вот это получаем:

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

7. Заключение

Думаю, данный подход является интересным опытом и в некоторых будущих задачах метод будет проверяться в рабочем высоконагруженном режиме. То, в каком виде он тут продемонстрирован, является лишь направлением к действию. Пример полностью работоспособный, но есть варианты оптимизации и более удобного использования. В первую очередь хочется уйти от использования физической таблицы с данными для поиска и улучшить расширяемость запроса SQL где идет объединение перед передачей в скрипт. Ещё будет хорошо сравнить производительность по различным вариантам. Есть ощущение, что обращение из R к SQL будет выигрывать в определенных случаях, особенно при использовании специализированных пакетов для R от MS (RevoScaleR). 

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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. jobkostya1c8 90 25.11.18 12:10 Сейчас в теме
Полезная статья. Одно ясно, надо учить MS SQL.
2. capitan 1632 25.11.18 13:30 Сейчас в теме
Грех не велик, а задумка богатая ...)
Что то я не видел поставщиков которые скульными таблицами передают данные номенклатуры.
Т.е. если решать задачу сопоставления с номенклатурой поставщика скорее надо код на стороне писать
Который прочтет номенклатуру 1С через ком коннектор и впишет степень соответствия или подходящий артикул 1С в файл поставщика
Тогда ничего нарушать не нужно будет ;)
jobkostya1c8; +1 Ответить
6. acsent 1149 26.11.18 11:08 Сейчас в теме
Показатель - это что такое, что-то не увидел
7. Robbi 56 26.11.18 12:00 Сейчас в теме
(6)
Показатель - это что такое, что-то не увидел

Значение показателя? Это величина, полученная по алгоритму сравнения строк. Степень похожести
8. logarifm 1072 26.11.18 13:24 Сейчас в теме
Правда я не понял для чего это все вообще?
в 1С есть такая классная штука как внешние источники данных.
9. Silenser 521 26.11.18 16:21 Сейчас в теме
За проделанную работу спасибо. Довольно интересный материал.
ИМХО, нужно было взять другую фактуру, что-то связанное с big data, потому как нечеткий поиск реализован в полнотекстовом поиске MS SQL, который реализуется гораздо проще, хотя для 1С он и потребует отдельной базы, т.к. нуждается в первичном ключе. К тому же R доступен с 2016, а полнотекстовый c 2008.
10. МихаилМ 26.11.18 19:06 Сейчас в теме
(0)
понятно , что задачу придумать сложно . НО...
дополните статью сравнением с реализацией Жаро-Винклера на t-sql. иначе смысл теряется. еще лучше сравнить с clr
11. Robbi 56 27.11.18 15:25 Сейчас в теме
(10) Статья не совсем о том. Вот в (9) правы, что пример не отражает возможностей.
Речь совсем не о реализации алгоритма распознавания и сравнивать его с исполнением на t-sql - тема другая.
Правильнее выбрать другую проблему, не реализуемую в лоб на t-sql и 1C, но тут может слишком специфичная задача получится.
А в статье просто подход продемонстрирован на задаче понятной большинству.
12. artfa 48 28.11.18 13:06 Сейчас в теме
Знал бы язык запросов в Sql, то же бы написал что-то подобное
13. acsent 1149 28.11.18 16:26 Сейчас в теме
Как отладка такого кода происходит?
15. Robbi 56 29.11.18 10:39 Сейчас в теме
(13)Примерно так:
Пишем запросы SQL для получения необходимых данных
Пишем на R основу, сам алгоритм проверяем на простых объектах. Если есть обращение к БД из R - помогает профайлер (в случае сложных запросов)
Затем создаем хранимую процедуру.
На каждом этапе все тестируем и проверяем, особенно если есть параметры.
В 1С остальное уже просто дописать.
14. DataReducer 225 28.11.18 18:30 Сейчас в теме
Несмотря на огромный потенциал R, эта среда у нас в стране пока не пользуется большой популярностью. Поэтому любая публикация на эту тему заслуживает внимания.
Для решения задачи из примера я бы не стал обращаться напрямую к БД, но так как это обзор компонентов MS SQL Server, пример хороший и жизненный.
Случалось ли вам на практике применять R для решения каких-нибудь других задач из сферы использования 1С?
16. Robbi 56 29.11.18 10:54 Сейчас в теме
(14) Использовал для обменов с каким-либо внешними источниками. Когда нужно предварительно обработать и "очистить" информацию. Т.е. получаем данные в R (например парсим сайт, или читаем стороннюю БД не 1Сную), обрабатываем их, получаем красивые наборы данных и отправляем в 1С, например через http-сервисы, поднятые в 1С, или в СУБД. Так же есть такая штука на R - Shiny server - для пользователей выводил в браузере аналитику по данным 1С он-лайн, графики, картинки с нужными фильтрами и прочими плюшками. Только это было больше для себя реализовано. Экономической целесообразности в таком подходе не вижу: в крупных компаниях используется специализированный софт, для мелких и средних гораздо дешевле и проще написать отчет на 1С.
DataReducer; +1 Ответить
17. for_sale 857 31.03.19 10:24 Сейчас в теме
Если я правильно понял, то основная мысль статьи:
но мы не ищем простых путей

:)

Так и не понял, где тут машин лёрнинг и чем это всё лучше нескольких строк кода в 1С.

Но если это просто абстрактный пример для ознакомления с механизмами, тогда низкий поклон.
Оставьте свое сообщение

См. также

Загрузка данных из М-Аптеки+ в 1С:Бухгалтерия 8 (ред. 3.0) Промо

Внешние источники данных Файловые протоколы обмена, FTP v8 v8::БУ БП3.0 Фармацевтика, аптеки БУ Абонемент ($m)

Обработка для загрузки файлов выгрузки из программы для автоматизации аптек и аптечных сетей М-Аптека+ в 1С:Бухгалтерия 8, редакция 3.0.

11.07.2014    31704    26    1C_MApteka    35    

И еще раз о HTTP-сервисах

WEB Внешние источники данных Интеграция v8 БП3.0 ЗУП3.x Россия Абонемент ($m)

Как разработать  подсистему обмена  с сильно ограниченными правами доступа к базе вопрошающего субъекта с использованием различных вариантов маршрутизации.

2 стартмани

28.04.2020    2758    5    zavsom    2    

Взаимодействие HTML (COM объект, WebKit) с 1С (обычные и управляемые формы)

Внешние источники данных WEB v8 v8::УФ 1cv8.cf Абонемент ($m)

Показан пример использования HTML (COM объект, WebKit) в 1С (8.3).

2 стартмани

18.01.2020    5544    19    Deniskinr83    0    

Google drive - менеджер файлов

WEB Внешние источники данных v8 1cv8.cf Россия Абонемент ($m)

Синхронизация с гугл диском легко и просто!

10 стартмани

05.12.2019    6681    21    zykov_vitaliy    22    

Менеджер загрузки данных из весов с печатью этикеток Промо

Внешние источники данных Весы Учет ТМЦ Учет ТМЦ v8 УТ10 УПП1 Абонемент ($m)

Программное обеспечение "Менеджер загрузки данных из весов с печатью этикеток" предназначено для автоматического получения данных по сети Ethernet из весов МАССА-К моделей ВПМ и ТВ_Р3 (модификация MF) в режиме On-Line.

1 стартмани

20.12.2011    18834    3    hrip    10    

Использование хранимых процедур MS SQL Server в 1С

Внешние источники данных v8 1cv8.cf Абонемент ($m)

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

1 стартмани

03.12.2019    7437    3    Dedushka    26    

Вебхук. Путь Телеграма

Внешние источники данных Интеграция v8 Абонемент ($m)

Долгое (на самом деле нет) и нелегкое путешествие телеграма к неведомым (из за РКН) конфигурациям 1С. Памятка себе.

1 стартмани

03.10.2019    13565    10    platonov.e    14    

Получение изображения с IP-камеры

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Получение изображения JPG с IP-камеры в виде двоичных данных. В 1С может применяться для фотографирования объектов.

1 стартмани

10.09.2019    8523    26    sivin-alexey    8    

Что нам стоит Push построить Промо

Внешние источники данных v8 v8::Mobile Абонемент ($m)

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

1 стартмани

08.09.2016    25472    17    PloAl    8    

Чтение файлов PDF из 1С

Внешние источники данных Универсальные обработки v8 1cv8.cf Абонемент ($m)

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

1 стартмани

09.09.2019    5647    4    da_1c    4    

Описание формата внутреннего представления данных 1С в контексте обмена данными

Практика программирования Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    15766    11    Dementor    29    

Согласование задач из Outlook

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Согласование задач непосредственно из почтовой программы, в моем случае Outlook 2013 без каких-либо дополнительных настроек. Из почты отправляется GET запрос к HTTP-сервису 1С, который в свою очередь выполняет задачу.

1 стартмани

06.09.2019    6509    11    duhh    17    

Обмен большими данными между клиентом и сервером

Внешние источники данных v8 Абонемент ($m)

В статье рассматривается вопрос передачи больших объемов данных, превышающих теоретический лимит сеансовых данных (4Гб за вызов) (они же временное хранилище) как с клиента на сервер, так и в обратном направлении.

1 стартмани

27.08.2019    11798    4    logos    24    

Телеграм 1С – почти коробка

Внешние источники данных v8 Абонемент ($m)

Почему это решение называется «почти коробка»? Потому, что это почти коробочное решение. С его помощью, просто добавив подсистему в конфигурацию, уже можно начинать взаимодействовать с мессенджером Telegram.

10 стартмани

20.08.2019    10488    21    zfilin    64    

Расширение Бром для интеграции с 1С

Внешние источники данных WEB v8 Абонемент ($m)

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

1 стартмани

06.08.2019    4881    4    itworks    13    

Выгрузка и подготовка данных для программы "Перечень льготных профессий" для 1С: ЗУП 2.5 (ОТКРЫТЫЙ КОД) Промо

Рабочее место Внешние источники данных Управление персоналом (HRM) Управление персоналом (HRM) v8 v8::СПР ЗУП2.5 Россия БУ ФОМС, ПФ, ФСС Абонемент ($m)

Обработка для формирования и редактирования данных для перечня льготных профессий. В связи с прекращением поддержки ЗУП 2.5 и отсутствием времени на доработку для сдачи годовой отчетности открыл код модуля. Не очередная выгрузка стажей, а практически полный аналог перечня для 1С. Формирование и редактирование стажей с последующей выгрузкой в формат перечня, но только ГОРАЗДО удобнее и быстрее. В общем, смотрите видео. Где-то половина времени на написание обработки ушла именно на удобство и скорость работы. Внимание: код модуля обработки открыт

5 стартмани

09.11.2015    48701    82    Black-fog    62    

Конфигурация для обмена данными (интеграционная шина)

Внешние источники данных WEB v8 1cv8.cf Абонемент ($m)

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

4 стартмани

08.07.2019    8462    25    miha-28    16    

Интеграция 1С с Битрикс CRM через REST API

Внешние источники данных v8 1cv8.cf Абонемент ($m)

На фоне неутихающего обострения «бизнеса» по внедрению СРМ-систем остро встают вопросы обмена данными с уже существующими системами. В статье рассматривается выгрузка контактов, товаров и сделок из 1С в Битрикс CRM через REST API, приложена обработка для тестирования.

1 стартмани

28.06.2019    16850    22    muzipov    9    

Почта России - отправка и отслеживание, интеграция с Документооборот 8

Внешние источники данных Документооборот и делопроизводство Документооборот и делопроизводство v8 ДО Россия Абонемент ($m)

Выгрузка почтовых отравлений в личный кабинет отправки Почты России; отслеживание почтовых отправлений через Почту России; расширение для интеграции Документооборот 8 с Почтой России

5 стартмани

04.06.2019    6914    47    wtlz    13    

Подсистема обмена данными с порталом ИМНС по электронным счетам-фактурам (автоматический обмен) Промо

Внешние источники данных WEB Инструментарий разработчика v8 1cv8.cf Беларусь БУ НДС Абонемент ($m)

Подсистема включает документы и обработки для автоматического обмена данными с порталом ИМНС через web-сервис. Присутствует возможность заполнения данными типовых операций за период, учёта входящих документов, учёта произвольных исходящих документов. Приложены обработки для запуска задания планировщика на автоматический обмен данными.

1 стартмани

28.07.2016    30794    19    c1nil    4    

Пример работы с viber из 1С, отправка сообщений из 1С в viber

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Обработка разработана для примера отправки сообщений в viber из 1С.

1 стартмани

16.05.2019    10577    64    Isa816    22    

Шаблон http-сервиса для вашего проекта

Внешние источники данных WEB Мобильная разработка v8 v8::Mobile 1cv8.cf Абонемент ($m)

Http-сервис для обмена данными в формате JSON. Обработчики этого сервиса находятся во внешней обработке, что позволяет дорабатывать его без изменения конфигурации. Также прилагаю пример мобильного приложения для работы с данным сервисом (получает номенклатуру и остатки на складе). Сервис очень быстро разворачивается и масштабируется под ваши задачи.

3 стартмани

04.05.2019    15720    63    MarkoSokolov    47    

1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки

Практика программирования Внешние источники данных Обмен через XML WEB Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

22.04.2019    27327    32    riposte    63    

 Интеграция 1С и C#. Обращение к 1С через COM. Создание номенклатуры и выполнение запроса к 1С из C# на примере интеграции с Союз-PLM (система информационной поддержки жизненного цикла изделий). Обработка «Загрузка заказа на сборку». (ERP) Промо

Загрузка и выгрузка в Excel Внешние источники данных Интеграция v8 ERP2 Абонемент ($m)

Союз-PLM представляет собой полнофункциональный программный комплекс для решения  широкого спектра задач управления инженерной технической информацией наукоемких изделий и сложных инженерных объектов в области машиностроения, приборостроения, архитектуры, строительства. На практике, это управление конструкторской документацией, интегрированное с САПР, бизнес-процессы, файловый архив. Все это работает в SQL и шевелится с помощью скриптов на C#. Скрипты свободно  отлаживаются в MS Visual Studio. Подробнее смотрите на их сайте: http://www.programsoyuz.ru/products/system-soyuz-plm.html  Редактирование, конструирование и использование бизнес-процессов на порядок лучше систем на базе 1С из тех, что я изучил.

1 стартмани

25.07.2016    40317    4    milkers    2    

WhatsApp чат для 1С

Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

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

5 стартмани

15.04.2019    8329    28    ManyakRus    19    

Доработка функционала отправки дополнительных реквизитов 1С: ЭДО для Татнефть

Внешние источники данных Документооборот и делопроизводство Документооборот и делопроизводство v8 ERP2 БУ Абонемент ($m)

Подключаемое расширение к конфигурации ERP с функционалом отправки дополнительных реквизитов 1С ЭДО для Татнефть (№ и дата договора, подразделение, автор, примечание) в электронных документах Счет-фактуры и ТОРГ-12 Проверялось на 1С:ERP Управление предприятием 2.4.6.160.

2 стартмани

07.04.2019    7453    11    sapervodichka    6    

Аутентификация на внешних сервисах посредством OAuth

Информационная безопасность Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

03.04.2019    16234    16    binx    118    

Импорт из EXCEL и других источников (xls, xlsx, xlsb, ods, sxc, dbf, mxl, csv, clipboard, sql) в 1С Промо

Загрузка и выгрузка в Excel Внешние источники данных Обработка справочников Практика программирования Обработка документов v8 КА1 БП2.0 УТ10 Розница Беларусь Украина Россия БУ Абонемент ($m)

-Наглядная, контролируемая загрузка иерархической номенклатуры с различными атрибутами и картинками из прайсов, файлов табличного вида xls,xlsx,xlsb,ods,sxc,dbf,mxl,csv произвольной структуры по указанному диапазону строк, а также из буфера обмена и внешнего SQL-источника данных в основные, дополнительные и пользовательские реквизиты. -Вариантный поиск номенклатуры. -Создание сопутствующей справочной информации. -Создание документов в национальной/иностранной валюте. -Обычное и управляемое приложение. Файл и Клиент-Сервер.

1 стартмани

16.03.2012    356537    2840    StepByStep    732    

Формирование xml файла ЭДО (СБИС, Диадок, Такском и т.п.) для типовых документов (счета-фактуры, накладные)

Внешние источники данных Обмен через XML Документооборот и делопроизводство Документооборот и делопроизводство v8 1cv8.cf Абонемент ($m)

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

4 стартмани

30.03.2019    26532    163    capitan    70    

Генерация схемы xsd из файла xml

Инструментарий разработчика Внешние источники данных v8 Абонемент ($m)

Утилита, генерирующая xsd схему на основании xml файла.

1 стартмани

25.03.2019    11269    19    fr13    10    

Декларации по формам 11 и 12 алкогольной продукции, интеграция с ПО Декларант-Алко

Розничная торговля Регламентированная отчетность Внешние источники данных Розничная торговля v8 Розничная и сетевая торговля (FMCG) Россия БУ Абонемент ($m)

Конфигурация на обычных формах, платформа 1С 8.2.19.130 и выше, с помощью которой можно сформировать Декларации по формам 11 и 12 алкогольной продукции, гибрид/интеграция с ПО Декларант-Алко версии 4.31.05 и выше.

1 стартмани

25.03.2019    7354    8    independ    8    

Самый простой клиент ЕГАИС УТМ для розницы. $m Промо

Внешние источники данных Рабочее место Розничная торговля Розничная торговля v8 1cv8.cf Россия УУ Абонемент ($m)

Данная обработка позволяет обеспечить приходную часть магазина розничной торговли алкоголем(ЕГАИС розница), или прочего предприятия. Эти действия становятся обязательными для розничного звена в городских поселениях с 01.01.2016 и будут достаточными до 01.07.2016. Предлагаю Вашему вниманию простое и доступное решение, которое позволяет отсрочить проблему интеграции ЕГАИС в розничное звено до указанной даты. (открытый код). Реализовано на открытой модели http://infostart.ru/public/402052/.

2 стартмани

14.12.2015    37299    45    Terrain25    47    

Работа с Active Directory из 1С (загрузка / выгрузка данных)

Внешние источники данных v8 1cv8.cf Россия Абонемент ($m)

Загрузка данных из Active Directory / Изменение информации пользователя в AD из 1С.

1 стартмани

26.02.2019    9505    71    Смешной 1С    7    

Телеграм + 1С + Вебхуки + Апач + Самоподписанный сертификат

Внешние источники данных v8 Абонемент ($m)

Много строк исписано про интеграцию Телеграма и 1С. Но нигде не увидел полной инструкции по установке и настройке вебхуков. Попробую её написать.

1 стартмани

26.02.2019    12833    11    alexlx    29    

Универсальное расширение 1С для Google Таблиц и Документов

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Эта статья для тех, кто использует G Suite и 1С. Готовое решение для выгрузки отчетов и печатных форм из баз 1С в Google Диск в формате Google Таблиц и Google Документов. Информация по его внедрению. Описание создания и настройки проекта в GCP.

1 стартмани

31.01.2019    13843    26    Maria18    20    

Модуль для работы 1С (платформа 8.2 и выше) с внешними SOAP Web-сервисами Промо

Внешние источники данных WEB Интеграция v8 1cv8.cf Абонемент ($m)

Модуль для работы 1С (платформа 8.2 и выше) с внешними Web-сервисами, реализованными по протоколу SOAP.

2 стартмани

15.02.2016    37680    83    lunjio    15    

HTTP API Диадок. Загружаем в Диадок любой документ. Посредством POST и GET запросов

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Поставили задачу через HTTP API Диадок (diadoc-api.kontur.ru) отправить любой файл в Диадок и подписать его (например, служебную записку в формате пдф). Посредством POST и GET запросов.

2 стартмани

14.01.2019    9237    22    John_d    8    

Интеграция WhatsApp в 1С (botcorp.io и api-messenger.com)

Внешние источники данных v8 Абонемент ($m)

Сейчас у WhatsApp более 1 млрд. пользователей во всём мире. В России мессенджер держится на верхних строчках по популярности среди всех мессенджеров. Из чего следует, что WhatsApp является самым желанным мессенджером для интеграции с 1С.

3 стартмани

22.11.2018    22370    56    17808849    49    

Исправление ошибки универсального обмена Бухгалтерия предприятия, редакция 3.0 (3.0.65.х, расширение конфигурации)

Внешние источники данных Адаптация типовых решений v8 БП3.0 Абонемент ($m)

Уже у третьего клиента вижу ошибку Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://www.1c.ru/SSL/Exchange/Message}Header Значит, как говаривал Винни-Пух - это неспроста. Ну и точно неспроста, 1С что-то подшаманили в обмене через универсальный формат.

1 стартмани

19.10.2018    13754    27    capitan    15    

7 причин, почему интеграция стала приятной. Не упускайте ряд потрясающих возможностей Промо

Внешние источники данных Интеграция Мобильная разработка v8 1cv8.cf Абонемент ($m)

В статье показаны примеры получения данных без программирования на стороне «1С:Предприятие 8». Вам нужно проверить гипотезу и проанализировать данные, почему бы не интегрироваться с Excel? Используете технологии .NET и «1С:Предприятие 8», процесс связывания систем движется катастрофически медленно? Хотите native Android приложение с вашими данными всегда под рукой?

1 стартмани

01.10.2015    53608    44    pbazeliuk    18    

Загрузка чека онлайн-касс (загрузка товаров из чека)

Внешние источники данных WEB Кассовые операции Розничная торговля Кассовые операции Розничная торговля v8 1cv8.cf Абонемент ($m)

Обработка-пример, позволяет любому и из любой конфигурации загрузить информацию о товарах из чека(и не только) с сервера ФНС proverkacheka.nalog.ru

2 стартмани

08.10.2018    15824    28    echo77    38    

Мониторинг показателей систем 1С 8.3 с помощью Zabbix

Внешние источники данных Zabbix v8 1cv8.cf Абонемент ($m)

Опишу свой опыт мониторинга наших систем 1С с помощью Zabbix и ту пользу, которую можно извлечить из этого.

1 стартмани

05.10.2018    33203    47    akimych    48    

Связка 1С и Telegram. Отправка стикеров

Практика программирования Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

31.07.2018    11184    4    Skin123    4    

Загрузка документов из системы Emex через веб-сервисы (Коммерция-Автологистика) Промо

Внешние источники данных WEB v8 v8::ОУ УТ10 УУ Абонемент ($m)

Обработка предназначенная для дилеров системы Emex, для загрузки документов из программы Коммерция(Автологистика) в 1С 8.2 Управление торговлей 10. Для загрузки используются веб-сервисы программы Автологистика.

10 стартмани

11.08.2014    19315    2    desarz    1    

Отправка сообщений через Telegram (через прокси)

Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Простая обработка для отправки сообщений из 1с в Телеграм конкретному пользователю. Используя прокси-сервер: jqlwb.teletype

1 стартмани

20.07.2018    14870    13    Deda    12    

Опыт интеграции мессенджера Telegram c 1C

Внешние источники данных Интеграция v8 Абонемент ($m)

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

19.07.2018    19004    0    VachKirp    38    

Обмен 1С:Управление Торговлей 11 и Frontol 5

Внешние источники данных Розничная торговля Розничная торговля v8 УТ11 КА2 Розничная и сетевая торговля (FMCG) Абонемент ($m)

Обработка обмена для 1С Управление Торговлей 11 и фронт-кассовой системы Frontol. Отличия от типовой: выгрузка дисконтных карт с накоплениями. Выгрузка категорий товаров.

3 стартмани

14.07.2018    15863    90    Kutuzov    141    

Оформление ветеринарных документов на продукты питания и грядущие глобальные изменения в 1С (часть 1) Промо

Внешние источники данных Оптовая торговля Розничная торговля Оптовая торговля Розничная торговля v8 Сельское хозяйство и рыболовство Оптовая торговля, дистрибуция, логистика Пищевая промышленность УУ Абонемент ($m)

С 01 января 2016 года возможно оформление ветеринарно-сопроводительных документов в электронном виде. Что это означает для предприятий, производящих и торгующих подконтрольной продукцией?

3 стартмани

27.12.2015    59227    7    axxell    28    

RabbitMQ + 1С. Быстрый старт

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Внешняя компонента для отправки сообщения из 1С в кролика. Сервис прослушивания и перенаправления сообщений из кролика в http или web-сервис.

1 стартмани

10.06.2018    25206    79    Goleff74    40    

Опять про sFTP и вообще

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Памятка для разработчика по работе с FTP, FTPs и sFTP.

1 стартмани

23.05.2018    16280    35    leongl    11    

Экономим время на ввод операций в 1С: Деньги

Внешние источники данных Обработка документов Банковские операции Банковские операции v8 1cv8.cf Домашние учет и финансы Абонемент ($m)

Рабочее решение автоматического создания операций в 1С: Деньги. Основано на анализе СМС.

1 стартмани

14.05.2018    11598    14    vsbronnikov    25    

Интеграция с Redmine (Rest-API)

Внешние источники данных v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

Интеграция с Redmine (Rest API). Тестировалось на 1С:Предприятие 8.3.12.1412 1. Получение списков Проектов, Трекеров, Статусов, Версий, Пользователей 2. Отбор задач по дополнительным полям (произвольные поля добавляемые пользователями в Redmine) 3. Получение Учета времени с отбором по пользователю и диапазону дат 4. Получение задач с различными отборами (гибкая настройка)

1 стартмани

28.04.2018    11738    40    lastpioneer    5