Внедрение ККМ Онлайн в сторонние конфигурации 1С







В данной статье мне бы хотелось поделиться опытом внедрения ККМ онлайн (Атол 11Ф) в одну из сторонних конфигураций 1С. Надеюсь, что она поможет сэкономить время моим коллегам, которые столкнулись с ситуацией, когда есть конфигурация, но ее поддержка разработчиком уже давно прекращена. В статье мы рассмотрим общие моменты, которые позволят «подружить» ее с онлайн кассами.

Итак, начнем с небольшого предисловия. Есть конфигурация Комильфо: Салон Красоты, поддержка которой была прекращена несколько лет назад, но в салоне, который относится к моей организации, она до сих пор используется. Как вы прекрасно знаете, государство обязало фирмы, работающие с наличными деньгами в принудительном порядке использовать онлайн кассы. И вот, руководство салона решило приобрести Атол 11Ф, но оказалось, что он не поддерживается данной конфигурацией. Тут стоит сказать несколько слов, о принципе работы с торговым оборудованием, который заложен в эту конфигурацию: как и, наверное, во всех конфигурациях от франчайзи 1С-Рарус, список доступного торгового оборудования «зашит» в специальной библиотеке, соответственно, без участия Раруса что-либо добавить в нее не представляется возможным. На просьбу добавить функционал для работы с Атол 11-Ф, была озвучена стоимость работ на 100 часов (а мы все, примерно, представляем сколько стоит 1 час работы крупного франчайзи) и руководство решило, что справится своими (т.е. моими) силами. Все, с предисловием закончили, теперь можно переходить к сути.

Я не буду останавливаться на подключении самого оборудования, так как все эти процедуры, уже были подробно описаны тут и тут. Было решено пойти по пути наименьшего сопротивления — взять готовый функционал из типовых конфигураций и перенести его. Как раз в феврале вышел свежий релиз УПП 1.3, в котором была реализована поддержка онлайн ККМ. Из УПП 1.3 нам понадобятся следующие объекты:

  1. Обработки — ТОСервер и ТОНастройка.

  2. Справочники — КассыККМ, ТорговоеОборудование и ОбработкиОбслуживанияТО.

  3. Документы — КассоваяСмена. В текущих релизах УПП, он сделан на управляемых формах, поэтому если вы не хотите переписывать его на обычные формы, то не забудьте включить использование управляемых форм в толстом клиенте в обычном режиме.

  4. Перечисления – ТООшибкиОбщие, СтатусыКассовойСмены, ТипыРасчетаДенежнымиСредствами.

  5. Регистры сведений – ТорговоеОборудование.

  6. Общие формы – ФормаНастройкиУниверсальныйДрайвер, ПараметрыФискализации.

  7. Общие модули – МенеджерОборудованияВызовСервера, МенеджерОборудованияКлиентСервер, МенеджерОборудованияКлиент, МенеджерОборудованияСервер, МенеджерОборудованияКлиентСерверПереопределяемый, МенеджерОборудованияКлиентПовтИсп, КассовыеСменыКлиент, КассовыеСменыВызовСервера.

В модуле обычного приложения:

  1. Определяем новые глобальные переменные:

Перем глПодключаемоеОборудование Экспорт;

Перем глСерверТО Экспорт;
  1. В процедуре

    ПриНачалеРаботыСистемы()

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

    МенеджерОборудованияКлиент.ПриНачалеРаботыСистемы()

  2. Прописываем функцию для взаимодействия с ТО:

Функция ПолучитьСерверТО() Экспорт

Если глСерверТО = Неопределено Тогда
глСерверТО = Обработки.ТОСервер.Создать();
КонецЕсли;

Возврат глСерверТО;

КонецФункции // ПолучитьСерверТО()

Далее, идем в документ, который отвечает за печать чека, в моем случае это был документ «Чек». 

При открытии документа подключаем работу с ТО:

ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);

При закрытии – отключаем:

ПолучитьСерверТО().ОтключитьКлиента(ЭтаФорма);

Так же нам необходимо внешнее событие :

Процедура ВнешнееСобытие(Источник, Событие, Данные)

Если Не ВводДоступен() Тогда
Возврат;
КонецЕсли;

ПолучитьСерверТО().ОбработатьВнешнееСобытие(Источник, Событие, Данные, ЭтаФорма);

КонецПроцедуры // ВнешнееСобытие()

И функция для поддержки ТО:

Функция ПоддерживаетсяВидТО(Вид) Экспорт

Результат = Ложь;

Если Вид = Перечисления.ВидыТорговогоОборудования.СканерШтрихКода
Или Вид = Перечисления.ВидыТорговогоОборудования.СчитывательМагнитныхКарт
Или Вид = Перечисления.ВидыТорговогоОборудования.ДисплейПокупателя
Или Вид = Перечисления.ВидыТорговогоОборудования.ЭлектронныеВесы
Или Вид = Перечисления.ВидыТорговогоОборудования.ФискальныйРегистратор
Или Вид = Перечисления.ВидыТорговогоОборудования.ТерминалСбораДанных
Или Вид = Перечисления.ВидыТорговогоОборудования.ЭквайринговаяСистема
Или Вид = Перечисления.ВидыТорговогоОборудования.ККТ Тогда
Результат = Истина;
КонецЕсли;

Возврат Результат;

КонецФункции // ПоддерживаетсяВидТО()

Теперь меняем процедуру, которая отвечает за печать самого чека. 

Процедура ОсновныеДействияФормыПробитьЧекНовый(Кнопка)
Перем Ответ;
Перем Отказ;

Если ПровестиИРаспечататьЧек(Ответ, Отказ, Истина) Тогда
флПробит        = Истина;
Попытка
ЭтотОбъект.Записать();
Исключение
КонецПопытки;
ПраваДоступа.НеДоступностьРедактированияЭлементовНаФорме(ЭлементыФормы);
ЭлементыФормы.ДействияФормы.Доступность = Ложь;
ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ПробитьЧекНовый.Доступность = Ложь;
Иначе
Предупреждение(?(Отказ, "Возможны расхождения ИБ и ленты ФР! ", "") + Ответ);
КонецЕсли;
КонецПроцедуры

И добавляем в модуль документа две функции: 

Функция ПровестиИРаспечататьЧек(Ответ, Отказ, РучнойРежимПечати = Ложь) Экспорт

Результат = Истина;
Ответ     = "";

Попытка
Записать();
Исключение
Ответ     = "Ошибка при попытке проведения документа!";
Отказ     = Истина;
Результат = Ложь;
Возврат Результат;
КонецПопытки;

Если ФлПробит Тогда
Возврат Результат;
КонецЕсли;

Если КассаККМ.ФормироватьНефискальныеЧеки
И КассаККМ.РучнойРежимФормирования
И Не РучнойРежимПечати Тогда
Возврат Результат;
КонецЕсли;

МассивФР      = ПолучитьСерверТО().ПолучитьСписокУстройств(
Перечисления.ВидыТорговогоОборудования.ФискальныйРегистратор,
КассаККМ);
МассивККТ     = ПолучитьСерверТО().ПолучитьСписокУстройств(
Перечисления.ВидыТорговогоОборудования.ККТ,
КассаККМ);
МассивФУ = Новый Массив();
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивФУ, МассивФР);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивФУ, МассивККТ);

ФУ            = Неопределено;
СписокФУ      = Новый СписокЗначений();
Вид           = Неопределено;
Представление = Неопределено;

Для каждого ФУ Из МассивФУ Цикл
ПолучитьСерверТО().ПолучитьПредставлениеУстройства(ФУ, Вид, Представление);
СписокФУ.Добавить(ФУ, Представление);
КонецЦикла;

КоличествоФУ = СписокФУ.Количество();
Если      КоличествоФУ = 0 Тогда
Ответ     = "";
Отказ     = Истина;
Результат = Истина;
Возврат Результат;
ИначеЕсли КоличествоФУ = 1 Тогда
ФУ = СписокФУ[0].Значение;
Иначе
ФУ = СписокФУ.ВыбратьЭлемент("Необходимо выбрать фискальное устройство");
Если ФУ = Неопределено Тогда
Ответ     = "Операция отменена пользователем.";
Отказ     = Истина;
Результат = Ложь;
Возврат Результат;
Иначе
ФУ = ФУ.Значение;
КонецЕсли;
КонецЕсли;

ОшибкаТО = Перечисления.ТООшибкиОбщие.ПустаяСсылка();

//У меня, организация не занимается продажей алкоголя, поэтому чтобы не переносить лишнее, было решено сразу установить "Ложь".
//Если у вас есть торговля алкоголем, тогда надо дополнительно перенести подсистему ИнтеграцияЕГАИС и смотреть, как реализовано
//взаимодействие с ЕГАИС в документе ЧекККМ, функция ПровестиИРаспечататьЧек.

ИспользуетсяРегистрацияВЕГАИС = Ложь;

ВидФУ = ПолучитьСерверТО().ПолучитьВид(ФУ);
Если ВидФУ = Перечисления.ВидыТорговогоОборудования.ККТ Тогда
ОписаниеПКС = КассовыеСменыВызовСервера.ОписаниеПоследнейКассовойСмены(ФУ);
Если ОписаниеПКС = Неопределено ИЛИ ОписаниеПКС.Статус = Перечисления.СтатусыКассовойСмены.Закрыта Тогда
Ответ = "Кассовая смена не открыта";
Отказ = Истина;
Результат = Ложь;
Возврат Результат;
КонецЕсли;
Результат = ФискализироватьЧек(ФУ, Ответ, Отказ);
Если Результат Тогда
ЧекПробитНаККМ = Истина;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ     = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ     = Истина;
Результат = Ложь;
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецЕсли;

ДопДанные = Новый Структура;
НомерСменыККМ = Число(СвязныйЧек.НомерСмены); //Номер смены (известен для копии чека)
НомерЧекаККМ = Число(СвязныйЧек.НомерЧека);

ТаблицаТоваров = ОплатаЧеком.Выгрузить();

ОшибкаТО = ПолучитьСерверТО().ПечатьЧека(ФУ, "", НомерЧекаККМ, НомерСменыККМ,ТаблицаТоваров, Ссылка.СуммаДокумента,0,Ложь, ДопДанные);

Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
ЧекПробитНаККМ = Истина;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ     = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ     = Истина;
Результат = Ложь;
КонецПопытки;
Иначе
Ответ     = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ     = Истина;
Результат = Ложь;
КонецЕсли;

Возврат Результат;

КонецФункции // ПровестиИРаспечататьЧек()
Функция ФискализироватьЧек(ФУ, Ответ, Отказ)

Ответ = "";
Отказ = Ложь;
Результат = Истина;

ПараметрыЧека = Неопределено;
ПодготовитьДанныеДляФискализацииЧека(Ссылка, ПараметрыЧека);

ОбъектДрайвера = Неопределено;
ОбработкаОбслуживания = Неопределено;
ПолучитьСерверТО().ПолучитьОбъектДрайвера(ФУ, ОбработкаОбслуживания, ОбъектДрайвера);

ОшибкаТО = ОбработкаОбслуживания.ФискализироватьЧек(ОбъектДрайвера, ПараметрыЧека);
Если ЗначениеЗаполнено(ОшибкаТО) Тогда
Ответ = ОбъектДрайвера.ОписаниеОшибки;
Отказ = Истина;
Результат = Ложь;
КонецЕсли;

Возврат Результат;

КонецФункции

И одну процедуру:

Процедура ПодготовитьДанныеДляФискализацииЧека(ЧекККМ, ОбщиеПараметры)

ОбщиеПараметры = МенеджерОборудованияКлиентСервер.ПараметрыОперацииФискализацииЧека();

ОрганизацияЧека = ЧекККМ.КассаККМ.Владелец;
// Шапка
ОбщиеПараметры.ДокументОснование = ЧекККМ;
Если ЧекККМ.ХозОперация = Перечисления.РежимЧека.Чек Тогда
ОбщиеПараметры.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств");
ИначеЕсли ЧекККМ.ХозОперация = Перечисления.РежимЧека.ЧекНаВозврат Тогда
ОбщиеПараметры.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств")
Иначе
Сообщить("Копии чека, больше не используются!");
Возврат;
КонецЕсли;

ОбщиеПараметры.Кассир = ЧекККМ.Ответственный.Наименование;
ОбщиеПараметры.Электронно = Ложь; // Чек будет напечатан
ОбщиеПараметры.Отправляет1СSMS = Ложь;
ОбщиеПараметры.Отправляет1СEmail = Ложь;
ОбщиеПараметры.ОрганизацияНазвание = ОрганизацияЧека.ПолноеНаименование;
ОбщиеПараметры.ОрганизацияИНН = ОрганизацияЧека.ИНН;
ОбщиеПараметры.ОрганизацияКПП = ОрганизацияЧека.КПП;
ПорядокНалогообложения = Неопределено;
ДопДанные.Свойство("ПорядокНалогообложения", ПорядокНалогообложения);
ОбщиеПараметры.КодСистемыНалогообложения = МенеджерОборудованияКлиентСервер.КодСистемыНалогообложения
(ОрганизацияЧека, ЧекККМ.Дата, ПорядокНалогообложения);
// Оплаты
ОплатыЧека = ЧекККМ.ПолучитьОбъект().ИтогиОплатПоТипам();
СуммаТипаОплаты = ОплатыЧека.Получить(Перечисления.ВидыОплаты.Наличные);
Если СуммаТипаОплаты <> 0 И СуммаТипаОплаты <> Неопределено Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", 0);
СтрокаОплаты.Вставить("Наименование", "Наличная оплата");
СтрокаОплаты.Вставить("Сумма", СуммаТипаОплаты);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
СуммаТипаОплаты = ОплатыЧека.Получить(Перечисления.ВидыОплаты.Безналичные);
Если СуммаТипаОплаты <> 0 И СуммаТипаОплаты <> Неопределено Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", 1);
СтрокаОплаты.Вставить("Наименование", "Платежная карта");
СтрокаОплаты.Вставить("Сумма", СуммаТипаОплаты);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
// Товарные позиции
Для Каждого СтрокаТовара Из ЧекККМ.ОплатаЧеком Цикл
СтрокаЧека = МенеджерОборудованияКлиентСервер.ПараметрыФискальнойСтрокиЧека();

// Обязательные поля
СтрокаЧека.Наименование = СтрокаТовара.Номенклатура.Наименование; // Наименовнование предмета расчета
СтрокаЧека.Количество = СтрокаТовара.Количество; // Количество предмета расчета
СтрокаЧека.Цена = СтрокаТовара.Цена; // Цена без учета скидок и наценок
СтрокаЧека.Сумма = СтрокаТовара.Сумма; // Cтоимость предмета расчета с учетом скидок и наценок
СтрокаЧека.СтавкаНДС = МенеджерОборудованияКлиентСервер.ПолучитьСтавкуНДСДляФискализацииЧека
(СтрокаТовара.Номенклатура.СтавкаНДС, ПорядокНалогообложения); // Cтавка НДС в %
//СтрокаЧека.Штрихкод = СокрЛП(СтрокаТовара.ШтрихКод); // Штрихкод
// Дополнительные реквизиты начиная с ФФД 1.1
СтрокаЧека.КодПризнакаСпособаРасчета = 4;  // Код признака способа расчета (Таблица 25 документа ФФД)
СтрокаЧека.КодПризнакаПредметаРасчета = ?(СтрокаТовара.Номенклатура.Услуга,4,1); // Код признака предмета расчета   (Таблица 25 документа ФФД)

ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
КонецЦикла;

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

Ну и последнее, что нам осталось, в общем модуле КассовыеСменыВызовСервера, в процедуре

ПослеВыполненияКомандыФискальнымУстройством(ПараметрыКоманды) Экспорт

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

Если (ПараметрыКоманды.ВыполняемаяКоманда = "CloseShift" ИЛИ ПараметрыКоманды.ВыполняемаяКоманда = "ЗакрытьСмену")
И ПараметрыКоманды.ОбрабатыватьЧекиККМ = Истина Тогда

//ЗакрытиеКС = Обработки.ЗакрытиеКассовойСмены.Создать();
//ЗакрытиеКС.Дата = КассоваяСменаОбъект.Дата;
//ЗакрытиеКС.КассаККМ = КассоваяСменаОбъект.КассаККМ;
//ЗакрытиеКС.ОбработкаЧековККМ(Справочники.Склады.ПустаяСсылка());
ЗакрытиеКС = Обработки.ЗакрытиеСмены.Создать();
ЗакрытиеКС.ОбработкаЧековККМ(КассоваяСменаОбъект.Дата, КассоваяСменаОбъект.КассаККМ.Владелец);
КонецЕсли;

Ах да, не знаю исправили эту ошибку или нет, но в феврале, при закрытии смены, всегда выдавало ошибку:

Ошибка вызова метода <ОбъектДрайвера.ЗакрытьСмену>. 
Ошибка при вызове метода контекста (XMLЗначение): Несоответствие типов (параметр номер ‘2’)

Все дело было в функции

ПолучитьПараметрыСостоянияСменыИзXMLПакета(Данные, НомерСмены)

  в общем модуле МенеджерОборудованияВызовСервера. Необходимо заменить на следующий код:

Функция ПолучитьПараметрыСостоянияСменыИзXMLПакета(Данные, НомерСмены) Экспорт

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Данные);
ЧтениеXML.ПерейтиКСодержимому();

Параметры = МенеджерОборудованияКлиентСервер.ПараметрыНормализуемыхФискальныхДанных();
Параметры.НомерСменыККТ = НомерСмены;

Если ЧтениеXML.Имя = "StatusParameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Прочитать() И ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.КоличествоНепереданныхФД    = Число(ЧтениеXML.ЗначениеАтрибута("BacklogDocumentsCounter"));
Параметры.НомерПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstNumber");
BacklogDocumentFirstDateTime = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime");
Если ЗначениеЗаполнено(BacklogDocumentFirstDateTime) Тогда
Параметры.ДатаПервогоНепереданногоФД  = XMLЗначение(Тип("Дата"), BacklogDocumentFirstDateTime);
Иначе
Параметры.ДатаПервогоНепереданногоФД = Дата(1,1,1);
КонецЕсли;
КонецЕсли;
КонецЕсли;

Возврат Параметры;

КонецФункции

Спасибо Алексею Васильеву.

Вот и все. Теперь через новую Обработку подключения оборудования загружаем обработки обслуживания и добавляем наш Атол 11Ф.

Время затраченное на обдумываение и реализацию, составило 2 рабочих дня и еще пару дней на отладку. Естественно, что в статье я не привожу полный код из перенесенных модулей и документов, но сразу скажу — в перенесенном «как есть» виде, он будет выдавать ошибки. Некоторые процедуры надо будет убрать, некоторые немного переделать, но все это быстро поддается отладке. Надеюсь, что данная статья будет вам полезна, если вы столкнетесь с похожей ситуацией. В случае возникновения каких-либо вопросов, можно задать их через ЛС.  

P.S. На двух последних скриншотах полностью показаны все новые объекты, которые я переносил из УПП. Так как я решил сделать задел на будущее и полностью перейти на типовую работу с ТО, то объектов в подсистеме несколько больше, чем указано в статье.

P.P.S. Компания 1С, очень трепетно относится к лицензионному соглашению, а так как при доработке конфигурации используется код из УПП, то будет не лишним напомнить, что у вас должна быть приобретена лицензия на этот программный продукт.  

25 Comments

  1. karpik666

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

    Reply
  2. lord_soth

    (1) Не скажу насчёт Автосалона, но для Комильфо Салон Красоты точно работает. С февраля все чеки печатаются только через 11ф, на сайте ОФД видны. Отправка чека по смс и на почту, пока не была реализована в текущих релизах, в УПП этих возможностей точно нет. Понятно, что код для разных конфигураций не будет совпадать с точностью до реквизита. Статья, по большей части, носит рекомендательный характер — откуда и какие именно части взять, которые отвечают за работу с онлайн кассами и доделать их под свои конфигурации.

    Reply
  3. karpik666

    (2) ааа, я думал автосалон тогда наверное да. Не думал вывести на форму реквизиты «Электронный чек» и «Вводить email или номер клиента», для настройки отправки чеков?

    Reply
  4. ivanov660

    Обожаю замечательный стиль в коде:

    1.

    Справочники.Организации.НайтиПоКоду(«0000000001»);

    и вот это тоже, замечательно

    2.

    СтрокаЧека.СтавкаНДС = 0; // Cтавка НДС в %
    Если СтрокаЧека.СтавкаНДС = Неопределено Тогда
    СтрокаЧека.СтавкаНДС = 0;
    КонецЕсли;

    3.

    ОбщиеПараметры.Кассир = ЧекККМ.Ответственный.Наименование;

    4. Надо было бы отметить, что код для обычного приложения.

    Reply
  5. spectre1978

    (4) с учётом того что выложено бесплатно и даже не за стартмани — и за это огромное спасибо. Автору от меня плюс.

    Reply
  6. lord_soth

    (3) Конечно думал, но пока такой срочной необходимости в электронных версиях чеков нет.

    Reply
  7. spectre1978

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

    Reply
  8. lord_soth

    (4) Со вторым замечанием согласен, в первым нет, но поправил, третье — это код самих разработчиков 1С, четвертое — вы невнимательно читали, там где перечислены объекты для переноса, сказано про обычное приложение.

    Reply
  9. premierex

    (0)

    …взять готовый функционал из типовых конфигураций и перенести его. Как раз в феврале вышел свежий релиз УПП

    Какое-то время назад я, разрабатывая индивидуальную конфигурацию для одной из организаций, решил использовать некоторые механизмы (давно отлаженные и отработанные) из типовой конфигурации от 1С. Но, поскольку, в организации шла борьба за чистоту программного обеспечения, решил проконсультироваться в компании 1С: будет ли нарушением лицензионного соглашения использование в собственной (индивидуальной) конфигурации объектов и (или) фрагментов кода из типовой конфигурации 1С? Ответ был однозначным: использование объектов, а также фрагментов программного кода типовых конфигурации без приобретения коробочного продукта с конфигурацией, фрагменты которой были использованы, является нарушением лицензионного соглашения с компанией 1С.

    Таким образом, для того, чтобы использовать вышеприведенную методику подключения ККТ онлайн и сохранить чистоту программного обеспечения в плане лицензирования, потребуется как минимум приобретение коробочного продукта 1С:УПП, рекомендованная цена которого на дату публикации составляет 223 000 руб. Стоит призадуматься…

    Reply
  10. lord_soth

    (12) Да, я тоже думал на этот счет, но так как у меня есть лицензионная УПП + ИТС, то проблем не возникло. На всякий случай, добавил этот момент в статью. Спасибо.

    Reply
  11. spectre1978

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

    Reply
  12. IVC_goal

    (12) Это все равно, что создать лицензию на алфавит. Абсурдность такой позиции («использование … фрагментов программного кода») очевидна и не доказуема с юридической точки зрения.Автору большой и жирный +

    Reply
  13. premierex

    (14) (15) И тем не менее… Как бы абсурдно это ни звучало…

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

    Ответы на типовые вопросы по лицензированию «1С:Предприятия 8».

    Reply
  14. IVC_goal

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

    Reply
  15. premierex

    (17) Синтаксические конструкции языка 1С под ограничения лицензионного соглашения не попадают, как и не охраняются законом о защите авторских прав, так как они являются неотъемлемой частью встроенного языка. Поэтому использование вышеприведенной конструкции никаких последствий не повлечет и повлечь не может.

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

    Reply
  16. IVC_goal

    (18) Отлично, что не попадает мы знаем, но более интересно (и не только мне) будет прочитать, какие существуют формализованные критерии оценки программного кода, который попадает под лицензионное соглашение? Только не общие слова.

    Reply
  17. premierex

    (19) Поизучайте материал по ссылке из (16). «Общие слова» именно оттуда.

    Reply
  18. KrivosheevEV

    В документации Атолла есть подробное описание интерфейса драйвера. Куча примеров для многих языков. Можно формировать чеки даже из Excel. К чему этот ажиотаж по 54ФЗ?

    Reply
  19. spectre1978

    (21) в основном стоит задача подключиться к кассе стандартными средствами без своих велосипедов или с минимальными, используя уже имеющиеся наработки для обычных касс.

    Reply
  20. rozer

    с выходом ут10.3.43 с поддержкой ффд 1.05 и прочих статья несколько устарела (

    Reply
  21. coolseo

    (21) Здравствуйте, примеры из эксель находятся тут?

    C:Program Files (x86)ATOLDrivers8SamplesFprnMExcel2000ExcelEx.xls

    Они точно под 54фз или только под древние драйвера?

    Reply
  22. KrivosheevEV

    (24) Примеры описывают взаимодействие с интерфейсом драйвера. И к 54ФЗ имеют косвенное отношение.

    Из опыта: на кассе успешно регистрируются операции, декларируемые в примерах; данные успешно уходят ОФД.

    Reply
  23. Marika2017

    А можете напрямую обратиться к разработчику программы Комильфо — ООО «УмКо», тел 8(8422) 27 27 80, у них есть готовый модуль.

    Reply
  24. Rustig

    (18) не получится «просто взять и скопировать» — не взлетит код

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

    короче говоря, не стоит заморачиваться.

    Reply
  25. user1261992

    Добрый день. Подскажите будет ли работать Ваша программа FR_Atol_Shtrih.exe с ККМ АТОЛ-92 F

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *