«А что, так можно было?!»
Аnonymous
Обратились старые клиенты, с которыми работаю давно, у них несколько центров принятия решений, и не ко всем задачам привлекают меня. Предложили подключить онлайн кассу, я как обычно написал им предложение, в котором описал 4 возможных подхода к решению задачи, чем вызвал у заказчика некоторое недоумение. Оказалось, что до меня за проект брались три новосибирские компании и две томские, и все закончилось провалом и заключением о невозможности подключения кассы. При этом только две компании из пяти прилагали усилия к раскрутке заказчика на переавтоматизацию на новой конфигурации. Я тоже сильно удивился, поскольку ничего сложного в задаче не увидел.
Описание задачи.
Заказчик - компания, с автотракторной спецификой, у которой есть филиал и два розничных магазина. Файловая 1С – УТ 10.2, многократно переделанная под их специфику расположена на сервере, пользователи подключаются к ней по RDP и RemoteApp. Продавцы в магазинах – это эксперты по технике и знают о запчастях все. Большая часть товара в магазинах не маркирована штрихкодом и вводить туда маркировку не осмысленно, цены на товары устанавливаются в УТ и никаких маркетинговых акций на кассе не предусмотрено. Требовалось автоматически бить чеки на онлайн кассе по ФЗ-54. Что касается самих касс, то предполагалась работа с кассами АТОЛ, поскольку уже была куплена касса АТОЛ-11Ф, которую так и не смогли «подружить» с конфигурацией.
Возможные подходы к решению задачи.
У меня есть опыт работы с оффлайн кассами Frontol, но в этом проекте оффлайн кассы не применимы. Подбор товара в чек происходит из иерархического справочника Номенклатура, там нет ни штрихкодов, ни кодов товара, оффлайн кассы под эту задачу не подходят, они заточены в первую очередь под сканер штрихкода.
Первый вариант – это установить на сервере атоловский драйвер ККМ, атоловский драйвер версии 8 поддерживает несколько касс, которые подключены к разным портам, порты пробросить, запуская на сервере батник с командой net use. А конфигурацию доработать, либо внедрив туда опубликованную 1С обработку обслуживания «АТОЛ ККТ с передачей данных», либо воспользоваться для интеграции готовой разработкой, Андрея Карпова, продающейся здесь на Инфостарте - //infostart.ru/public/590993/ - ККТ-ОНЛАЙН 54-ФЗ: Обработка для работы фискальных регистраторов АТОЛ, ШТРИХ-М, ИСКРА, Пирит и Viki Print + ЭМУЛЯТОР (С бесплатным тестовым периодом). В принципе, вполне рабочий вариант. Что мне не нравилось в этом варианте: во-первых, проблемы с надежностью проброса портов, а во-вторых, перспективы поддержки всего решения. Если через год-два наши законодатели внесут очередное новшество, то будут танцы с бубнами. Мне этот вариант не понравился.
Второй вариант - это на локальной машине развернуть драйвер ККМ. Использовать на локальной машине программу печати чеков Александра Гельмера, которая распространяется за стартмани тут на Инфостарте //infostart.ru/public/609030/ Программа сидит в трее, и как только в известную папку попадает текстовый файл с описанием чека, касса тут же бьет чек. На мой взгляд, этот вариант куда веселее первого. С точки зрения трудоемкости внедрения и стоимости вариант самый выгодный. Не нравятся две вещи – опять перспективы поддержки при изменении законодательства и то, что у пользователя отсутствует контроль над тем, что происходит на локальной машине. Не понятно, где произошел сбой – в 1С, на сервере, на локальной машине, на драйвере, на кассе. Алгоритм поиска неисправности и «починки» будет относительно сложно восприниматься пользователем. Гарантированно будут дергать, если бы я бы в этом проекте был бы внутренним программистом компании, то это было бы жирным плюсом, но поскольку я выступаю как фрилансер, то моя задача сделать так, чтобы трудозатраты на поддержку были бы минимальны.
Третий вариант, купить коробку 1С Розница 2.2 базовая и развернуть ее на кассе. Дальше сделать в конфигурации Конвертация данных файл обмена для Универсального обмена в формате XML чтобы мы из УТ10 загружали в розницу номенклатуру и цены, а оттуда загружали отчеты о розничных продажах. Пользователь работает не в интерфейсе кассира, а в форме документа Чек ККМ и выполняет нормальный подбор номенклатуры в табличную часть. Когда пытается завершить кассовую смену, розница проинформирует пользователя об отрицательных остатках и предложит оприходовать отрицательные остатки. Пользователь оприходует отрицательные остатки, закроет кассовую смену, выгрузит данные из Розницы в УТ. Вариант очень дешевый, коробка с базовой розницей стоит смешных денег, обновления бесплатны. Проблема с поддержкой в случае изменения законодательства переносятся на фирму 1С, накатывай своевременно обновления и нет проблем. Серьезный минус этого варианта – слишком заумный сценарий работы пользователя.
Наконец четвертый вариант, - взять и «объединить» второй вариант с третьим. Используя библиотеку подключаемого оборудования, написать свою «кассу», которая бы на локальной машине постоянно ожидала файл с чеком от УТ10, и получив файл выводила бы форму документа Чек ККМ на экран, чтобы пользователю, оставалось убедиться, что именно такой чек ему и нужно принять, оформить на кассе оплату - наличными или платежной картой и далее фискализировать чек или отменить его. При относительно высокой трудоемкости этого варианта и необходимости наличия свободной пользовательской лицензии и подписки на ИТС (у всех нормальных, 1С бухгалтерия с необходимой подпиской на ИТС), у этого варианта я нашел ряд важных плюсов:
- Простой сценарий работы пользователя, без лишних движений;
- В случае сбоев, очевидно, что делать и достаточно будет простой инструкции для пользователя по диагностике и устранению проблем, чтобы снять с себя эту головную боль;
- Все проблемы с поддержкой, при изменении законодательства на фирме 1С, моя задача будет накатить обновление подсистемы Библиотека подключаемого оборудования.
Этот вариант я и согласовал и назвал проект «Тонкая касса».
Отступление для начинающих 1С разработчиков.
Примерно так, как написано выше я описал заказчику все четыре подхода к возможному решению задач, а потом согласовал «правильный» вариант. Это может вызвать удивление, но я всегда так поступаю, вне зависимости от уровня лояльности клиента. В нашем бизнесе, всегда нужно закладываться на то, что ваше предложение, а возможно и аудиоролик вашего телефонного общения с заказчиком будет отправлен эксперту, а может быть и нескольким экспертам. И решение будет принято на основании заключения эксперта. Например, от этого проекта у меня в вотсапе остался пятиминутный аудиоролик, в котором заказчику убедительно рассказывают про невозможность подключения кассы и необходимость запуска проекта «переавтоматизации». Не ценят люди своей репутации.
Второй важный момент в описании вариантов подхода заключается в том, что каждый вариант обладает своими плюсами и минусами, и принимая тот или иной вариант, заказчик соглашается с присущими выбранному варианту минусами, и скорее всего не будет сильно расстраиваться по поводу этих минусов.
Еще нужно один момент понимать, у любого 1С проекта, могут быть три разных типа исполнителя – собственный 1С программист, системный интегратор (компания 1С франчайзи), фрилансер. У каждого из этих типов исполнителей будет своя точка зрения на проект, зачастую кардинально отличная от другой точки зрения. В известную поговорку – «что русскому хорошо, то немцу смерть», вместо немца и русского можно в любых комбинациях подставлять наши типы исполнителей и при этом, поговорка смысла не потеряет.
Я в этом проекте выступал, как фрилансер, соответственно тут изложена точка зрения фрилансера на проект. Одним из важнейших расхождений во взглядах - это вопрос о последующей поддержке решения. Для системного интегратора, который «садит» заказчика на платную поддержку, поддержка – это прекрасно. Чем больше он счетов за поддержку выставит, тем больше денег заработает. Для собственного 1С программиста в трудозатратах на поддержку пользователей тоже ничего плохого нет – при правильном подходе к поддержке, авторитет программиста возрастет и у него появится аргумент для увеличения зарплаты. А вот фрилансеру за поддержку пользователей платить никто не будет. Скажут – «Ваша программа не работает, разбирайтесь», а то, что сбой произошел из-за некорректных действий пользователя, никого волновать не будет. Поэтому фрилансерские решения должны требовать минимально возможной поддержки, не должны давать пользователю совершать неправильные действия, и чтобы в случае сбоя, пользователь смог самостоятельно, не теряя времени, вернуть все в рабочее состояние. Если нет возможности серьезно упростить себе жизнь с последующей поддержкой, то лучше за такой проект
не браться.
Описание функционала и сценарий работы Тонкой кассы.
На стороне УТ. Продавец магазина (далее Пользователь) обычным образом создает и проводит документ ЧекККМ. На форму документа ЧекККМ добавим кнопку с заголовком Пробить чек на онлайн кассе. Пользователь будет эту кнопку использовать и больше при «пробитии чека» ничего на стороне УТ пользователю делать не нужно.
Каждая онлайн касса принадлежит своему складу. Нужно решить вопрос с правами доступа. Использовать кнопку Пробить чек на онлайн кассе, могут только продавцы и только на своем складе. Добавляем в УТ непериодический независимый регистр сведений КассирыОнлайнКассы, с измерениями Кассир – тип справочник ссылка Пользователи и Склад – справочник ссылка Склады и ресурсом КаталогОбмена с типом строка, куда будем записывать путь к папке обмена на нужную кассу.
В обработчик нажатия кнопки Пробить чек на онлайн кассе вместе с проверкой проведен ли документ ЧекККМ, будет проводить проверку Кассир-Склад, пользователя берем из параметров сеанса, склад – из документа Чек ККМ.
Организация является плательщиком НДС, и весь их товар, идет с НДС 18%, НДС будем рассчитывать на кассе. Об этом подробнее расскажу в описании на стороне Тонкой кассы.
Для передачи данных на Тонкую кассу буду использовать XML формат, так оно будет проще. После всех описанных выше проверок, обработчик кнопки проверит наличие файла с чеком в папке обмена, если он там есть – это будет означать, что наша Тонкая касса еще не переварила прошлый чек и с ней нужно будет разобраться, пользователь будет предупрежден и файл с новым чеком не будет сформирован. Если старого файла там нет, то в папке будет создан XML файл с описанием чека. На стороне УТ все.
На картинке образец XML файла
На стороне Тонкой кассы. В первую очередь, оттуда будет осуществляться управление кассой – открытие кассовой смены, закрытие кассовой смены, снятие X-отчета.
Тонкая касса будет работать в файловом режиме и будет каждые пять секунд проверять наличие файла с чеком. При обнаружении файла, Тонкая касса разбирает файл, удаляет его из папки обмена и выводит на экран заполненную форму документа ЧекККМ, Пользователю останется только оформить оплату – наличными, либо банковской картой (эквайринг) и фискализировать чек, либо отложить чек.
На скриншоте ниже - заполненная форма
Используются эквайринговые терминалы, в которые продавец вручную вносит сумму оплаты, поэтому нет необходимости в подключении эквайрингово терминала к Тонкой кассе.
Также на Тонкой кассе можно выполнить возврат по чеку и пробить чек коррекции.
Никакие данные из Тонкой кассы в УТ передаваться не будут, и при отмене и аннулировании чека и при возврате по чеку - ручная переделка документа ЧекККМ в УТ на совести продавца.
Учет товаров на Тонкой кассе не нужен, поскольку он ведется в УТ, контролировать остаток денежных средства в денежном ящике тоже нет необходимости.
Сама папка обмена находится на сетевом диске, если машина пользователя находится в одной локальной сети с сервером или через установленный на сервере и на локальной машине Яндекс-диск.
С Тонкой кассой будет работать единственный пользователь с полными правами.
Вот и все описание проекта, из описания должно быть понятным, почему я это назвал Тонкой кассой.
Я это все согласовал с заказчиком и приступил собственно к кодингу.
Еще одно небольшое отступление для начинающих 1С разработчиков.
В нашем бизнесе, эти предпроектные работы по сбору требований, проектированию и согласованию функционала обычно не менее трудоемки, чем собственно кодинг. Если для собственного 1С программиста это не особо важно, он может все хоть по десять раз переделывать, аванс и получка все равно по расписанию, то для фрилансера и системного интегратора необычайно важно делать это с максимально возможной эффективностью. Тут нужно уметь быстро оформлять свои мысли и мысли заказчика в виде доступного для понимания печатного текста уже эти тексты согласовывать. Править текст в MS Word значительно проще, чем код в конфигураторе. Учитесь писать и пользуйтесь любыми возможностями для прокачки навыков технического писателя.
Реализация.
На стороне УТ. Я сначала написал для отладки внешнюю обработку, которая подключается через Файл – Открыть. В форме обработки выбирается документ ЧекККМ и по нажатию на кнопку Выполнить, обработка сохраняет XML-файл в выбранную папку, дальше уже можно использовать этот файл для тестирования Тонкой кассы.
После того, как я добился того что нужно от Тонкой кассы, я добавил в УТ описанный выше регистр сведений, и на базе уже отлаженного кода обработки сделал обработчик кнопки Пробить чек на онлайн кассе формы документа ЧекККМ.
Я выкладываю эту обработку здесь, в модуль формы обработки, я поместил еще и закомментированный код обработчика кнопки.
На стороне Тонкой кассы. Предстояло на базе подсистемы Библиотека подключаемого оборудования (далее БПО), сделать крошечную специализированную конфигурацию, реализующую описанный здесь функционал.
До этого, я как программист с этой подсистемой дел не имел. Обожаю проекты, в которых освоение новых технологий происходит за счет заказчика.
Дистрибутив подсистемы представлял из себя файл конфигурации, файл выгрузки базы, который является шаблоном демобазы примера реализации и два руководства – «Порядок внедрения БПО» и «Применение функционала БПО в конфигурациях». Соответственно, как вставлять подсистемы БПО в свои конфигурации описаны в первом мануале, а функционал - во втором. Так же примеры реализации можно посмотреть в демобазе.
Мне от БПО нужен был функционал, касающийся только онлайн кассы, но я решил на всякий случай заранее предусмотреть дальнейшее развитие Тонкой кассы, поэтому перенес в Тонкую кассу весь функционал БПО.
Мне на тонкой кассе справочник Номенклатура не нужен. Для кассы нужна строка с наименованием товара, соответственно в табличной части товары документа ЧекККМ вместо ссылки на элемент справочника Номенклатура будет просто строка с наименованием товара.
Дальше создал в конфигурации документ ЧекККМ с формой документа, из которой пользователь и будет бить чеки. Нет никакого смысла изобретать велосипед. Я вдумчиво, сверяясь с мануалом и там где нужно редактируя, перенес нужным мне функционал из демобазы. В модуль формы и общие модули пришлось перенести чуть больше 600 строк кода. В демобазе не был реализован чек возврата, пришлось самому это делать. В процессе отладки выяснилось, что я утащил и лишнее, но не стал тратить свое время на удаление лишнего функционала, просто убрал видимость. На работу это никакого влияния не окажет.
В силу специфики этого проекта сделал недоступным редактирование табличной части Товары в форме - в чеке на оплату, и сделал возможным удалять строку и изменять количество в чеке возврата. В данном случае нет необходимости контролировать действия пользователя на стороне Тонкой кассы (весь товарный учет в УТ), просто таким образом включил защиту от «человеческого» фактора.
Кроме констант, которые использовались во взятом из демобазы функционале, пришлось добавить парочку своих констант – ПутьКПапке и РабочаяСтавкаНДС. ПутьКПапке – это путь к папке, которую Тонкая касса будет проверять каждые 5 секунд, а РабочаяСтавкаНДС – это та ставка, по которой проходит весь товар. С 01.01.2019 ожидается переход с НДС 18% на НДС – 20%, я заранее этот переход зашил в конфигурацию, и все что нужно будет для перехода сделать, это изменить эту константу.
Отлаживался я при помощи 1С эмулятора фискального регистратора. У него к сожалению нет ряда функции онлайн кассы, но все равно удобная вещь.
Теперь нужно научить Тонкую кассу каждые 5 секунд заглядывать в папку и искать там XML файл с описанием чека. Поскольку предполагается работа Тонкой кассы в файловом варианте, то подключил обработчик ожидания. В процедуру ПриНачалеРаботыСистемы() модуля управляемого приложения добавил вызов процедуры
ПодключитьОбработчикОжидания("ПроверкаНаличияФайла", 5,);
А процедуру ПроверкаНаличияФайла() описал в общем модуле. Процедура, если находит в папке правильный файл, то на основании данных оттуда открывает заполненную форму документа ЧекККМ и пользователю остается только оформить оплату и фискализировать чек.
Для того чтобы у пользователя был удобный инструмент для очистки базы от старых данных, добавил обработку Удаление старых документов.
В процессе развертывания, я потратил около 20 минут, нарубил скриншотов и составил инструкцию для кассира. Эта инструкцию, слегка исправленную я также выложил здесь.
Маленькое отступление для начинающих 1С разработчиков по поводу мануалов.
Существует неправильное мнение, что якобы пользователи не читают пользовательских инструкций. Есть верный способ заставить пользователя это делать. Для начала нужно составить пользовательскую инструкцию, в самом конце этой инструкции написать свой контактный телефон и сохранить файл с этой инструкцией на рабочем столе пользователя. Если что-то у пользователя случится, он откроет инструкцию, поскольку мой телефон там записан и пока до телефона доберется, будет вынужден эту инструкцию просмотреть. Нередко именно в этот момент пользователь в инструкции находит ответ на свой вопрос. Если он все-таки звонит, то первым темпом прошу его открыть инструкцию, далее прошу его найти в инструкции соответствующий пункт. И когда он этот пункт находит, прошу его прочитать что там написано и после того, как он мне это прочтет, прошу его сделать все что там написано и позвонить мне, рассказать о результате. Поверьте, большинству людей крайне неприятно выглядеть идиотами в чужих глазах, поэтому в следующий раз пользователь столкнувшись с проблемой сначала почитает мануал и только потом станет мне набирать.
Вот такой «микропроект» получился. Я сюда выложил три файла:
- Конфигурация «Тонкая касса», работает на платформе 1С 8.3.10 и старше.
- Внешняя обработка для УТ 10.2 которую я использовал для отладки в модуле формы я сохранил код обработчика кнопки, которая пошла в конфигурацию.
- Инструкция пользователя «Тонкой кассы».
Что касается инструкции по подключению и настойке «Тонкой кассы», то в ней смысла нет, поскольку настройка и подключение практически ничем не отличается от настройки и подключения кассы к любой 1С конфигурации, сделанной с использованием БПО. Требуется только ввести в константу путь к папке обмена на локальной машине.
При необходимости, можно с относительно небольшими затратами нарастить функционал и подключить любое, из списка поддерживаемого фирмой 1С оборудования.
Заключение.
Уже месяц, как все у заказчика работает, и меня практически не дергали на предмет поддержки.
Наверняка найдутся люди, которые станут утверждать, что такое решение - это «костыль» и надо было «переавтоматизировать» их на новой платформе.
Я с одной стороны согласен, что это «костыль», но это во-первых правильный «костыль», а во-вторых, в такого типа костылях ничего плохого нет, а проект «переавтоматизации» нужно затевать не раньше, чем возникнет ситуация, когда бизнес уже в рамки старой программы не помещается.
Если рассматривать описанную тут ситуацию, то все прекрасно работает на «допиленной» УТ 10.2 в файловом варианте. Переход на УТ 11.4 потребует приобретение нового сервера и покупки лицензий на конфигурацию, на SQL сервер, потом потребует услуг 1С программиста на проект «переавтоматизации» и фирму при этом первые пару месяцев будет ощутимо лихорадить. Все совокупные затраты на новое серверное железо, лицензии и услуги программиста встанут в сумму достаточную для покупки нового Lada 4x4 в автосалоне. И все ради подключения двух касс.