В данной статье рассмотрим проблему, с которой обращаются ко мне коллеги на Инфостарте, а также множество клиентов.
Типовое описание, с которым обращаются: "После нажатия на кнопки "Наличная оплата", "Плат. карта" или "Сложная оплата" 1С зависает на N секунд/минут, если в чеке есть алкоголь с марками".
После банального замера производительности выяснилось, что проблема кроется в процедуре "ПроверитьАкцизныеМаркиПередЗаписьюЧека" общего модуля "ПродажиСервер", а именно, в запросе:
"ВЫБРАТЬ
| АкцизныеМарки.КлючСвязи КАК КлючСвязи,
| АкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка
|ПОМЕСТИТЬ ТаблицаАкцизныеМарки
|ИЗ
| &АкцизныеМарки КАК АкцизныеМарки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Организации.КлючСвязи КАК КлючСвязи,
| Организации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизации
|ИЗ
| &Организации КАК Организации
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаАкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка,
| ТаблицаОрганизации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизацииИМарки
|ИЗ
| ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизации КАК ТаблицаОрганизации
| ПО ТаблицаАкцизныеМарки.КлючСвязи = ТаблицаОрганизации.КлючСвязи
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЧекККМ.Ссылка КАК Ссылка,
| ЧекККМ.Дата КАК Дата,
| ЧекККМ.Номер КАК Номер,
| &Продажа КАК ПоследняяОперация
|ИЗ
| Документ.ЧекККМ.АкцизныеМарки КАК ЧекККМАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМ
| ПО ЧекККМАкцизныеМарки.Ссылка = ЧекККМ.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекККМАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ЧекККМ.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ЧекККМ.Проведен
| И ЧекККМ.ВидОперации = &Продажа
| И &УсловиеЧек
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекККМ.Ссылка,
| ЧекККМ.Дата,
| ЧекККМ.Номер,
| &Возврат
|ИЗ
| Документ.ЧекККМ.АкцизныеМарки КАК ЧекККМВозвратАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМ
| ПО ЧекККМВозвратАкцизныеМарки.Ссылка = ЧекККМ.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекККМВозвратАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ЧекККМ.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ЧекККМ.Проведен
| И ЧекККМ.ВидОперации = &Возврат
| И &УсловиеЧекВозврат
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекЕГАИС.Ссылка,
| ЧекЕГАИС.Дата,
| ЧекЕГАИС.Номер,
| &Продажа
|ИЗ
| Документ.ЧекЕГАИС.АкцизныеМарки КАК ЧекЕГАИСАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекЕГАИС КАК ЧекЕГАИС
| ПО ЧекЕГАИСАкцизныеМарки.Ссылка = ЧекЕГАИС.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекЕГАИСАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| ЧекЕГАИС.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваров.Ссылка,
| РеализацияТоваров.Дата,
| РеализацияТоваров.Номер,
| &Продажа
|ИЗ
| Документ.РеализацияТоваров.АкцизныеМарки КАК РеализацияТоваровАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО РеализацияТоваровАкцизныеМарки.Ссылка = РеализацияТоваров.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО РеализацияТоваровАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (РеализацияТоваров.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| РеализацияТоваров.Проведен
| И РеализацияТоваров.ПробитЧек
| И &УсловиеРеализация
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекЕГАИСВозврат.Ссылка,
| ЧекЕГАИСВозврат.Дата,
| ЧекЕГАИСВозврат.Номер,
| &Возврат
|ИЗ
| Документ.ЧекЕГАИСВозврат.АкцизныеМарки КАК ЧекЕГАИСВозвратАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекЕГАИСВозврат КАК ЧекЕГАИСВозврат
| ПО ЧекЕГАИСВозвратАкцизныеМарки.Ссылка = ЧекЕГАИСВозврат.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекЕГАИСВозвратАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| ЧекЕГАИСВозврат.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВозвратТоваровОтПокупателя.Ссылка,
| ВозвратТоваровОтПокупателя.Дата,
| ВозвратТоваровОтПокупателя.Номер,
| &Возврат
|ИЗ
| Документ.ВозвратТоваровОтПокупателя.АкцизныеМарки КАК ВозвратТоваровОтПокупателяАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.Ссылка = ВозвратТоваровОтПокупателя.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ВозвратТоваровОтПокупателя.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ВозвратТоваровОтПокупателя.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АктСписанияЕГАИС.Ссылка,
| АктСписанияЕГАИС.Дата,
| АктСписанияЕГАИС.Номер,
| &Продажа
|ИЗ
| Документ.АктСписанияЕГАИС.АкцизныеМарки КАК АктСписанияЕГАИСАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументовЕГАИС КАК СтатусыДокументовЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = СтатусыДокументовЕГАИС.Документ
| И (НЕ СтатусыДокументовЕГАИС.Статус В (&НевыгруженныеСтатусы))
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АктСписанияЕГАИС КАК АктСписанияЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = АктСписанияЕГАИС.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО АктСписанияЕГАИСАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| АктСписанияЕГАИС.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АкцизныеМаркиЕГАИС.Основание,
| АкцизныеМаркиЕГАИС.Основание.Дата,
| АкцизныеМаркиЕГАИС.Основание.Номер,
| &Продажа
|ИЗ
| РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ПО АкцизныеМаркиЕГАИС.АкцизнаяМарка = ТаблицаАкцизныеМарки.АкцизнаяМарка
|ГДЕ
| НЕ АкцизныеМаркиЕГАИС.Основание = &ДокументСсылка
| И АкцизныеМаркиЕГАИС.Статус = &Реализована
| И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ,
| Ссылка УБЫВ"
Первое впечатление: а, собственно, зачем все это городить? Есть регистр сведений "Акцизные марки ЕГАИС", почему нельзя использовать запрос к нему для получения статуса марок? Ведь именно для этого он и нужен!
Первый ответ, который пришел в голову: возможно, в 1С решили подстраховаться на случай, если в регистре по какой-то причине нет записи о статусе марки (например, "потерялись" вследствие повреждения базы).
"Пощупав" данный вывод с разных сторон приходим к, как я думаю, реальной причине: этот регистр ввели в конфигурацию только с появлением поддержки новых акцизных марок, поэтому в этом регистре может не быть информации о продажах марок старого формата!
Например, у вас есть недобросовестный кассир, который в "седые" года в старой версии Розницы зарегистрировал продажу некоторой марки старого образца, а по факту отдал клиенту другую бутылку. Поштучного учета по таким маркам нет, расхождений по количеству тоже не будет, поэтому вы подвоха не заметите. Пусть эта бутылка у вас неожиданно пролежала до сегодняшнего дня, когда появился регистр сведений "Акцизные марки ЕГАИС", в котором статуса той формально проданной марки нет. И вот, наконец, кассиру при продаже в руки попадается бутылка с той самой маркой, продажа которой уже зарегистрирована в ЕГАИС. Вот в этом случае 1С уже "на корню" обрубит продажу, так как увидит, что есть в базе чек с этой маркой. С другой стороны, есть УТМ, который со своей стороны также проконтролирует факт повторной продажи, но в том случае, если:
- у вас во время пробития есть выход в Интернет;
- УТМ успешно получил результат проверки марки с сервера ФСРАР в течение 3 секунд.
Давайте поразмышляем над тем, как можно повлиять на время выполнения данного запроса. Прежде всего проанализируем, какие таблицы могут привести к увеличению времени выполнения запроса. Конечно же, самые большие таблицы - это:
- Документ.ЧекККМ
- РегистрСведений.АкцизныеМаркиЕГАИС
Выборку из регистра сведений трогать не стоит, к тому же на нее тратится не так много времени, а вот выборка чеков ККМ как раз и приводит к значительному увеличению времени выполнения. Поэтому сразу на ум приходит первое решение проблемы...
Вариант 1: свертка информационной базы (нет ограничений)
Да, действительно, после свертки ожидаем, что количество чеков ККМ у нас значительно сократится и нормализуется скорость работы.
Но, вы должны четко понимать, что в этом случае вы потеряете данные о фактах продажи марок старого образца, которых нет в регистре сведений "Акцизные марки ЕГАИС". К тому же процесс свертки может затянуться и привести к непредвиденным результатам, особенно если были ошибки ведения учета.
Вариант 2: удаление чеков ККМ (нет ограничений)
Данный вариант - это своего рода частный случай первого варианта. Как известно, архивные чеки не делают никаких движений по регистрам. Поэтому можно групповой обработкой в режиме разработчика пометить эти чеки на удаление и потом окончательно удалить.
Риски тут все те же, что и в 1 варианте
Вариант 3: исправление запроса расширением (должна быть ПРОФ-версия платформы)
Допустим, вы решились полностью положиться на УТМ или уверены в своих кассирах на все 101%, а также у вас стоит ПРОФ-версия Розницы (или базовая Розница работает под платформой версии ПРОФ: например, если на том же ПК активирована лицензия на другой ПП 1С уровня ПРОФ). В этом случае вы можете исправить данный запрос расширением. Для этого в расширение перенесите общий модуль "ПродажиСервер" и вставьте следующий код:
&ИзменениеИКонтроль("ПроверитьАкцизныеМаркиПередЗаписьюЧека")
Процедура уо_ПроверитьАкцизныеМаркиПередЗаписьюЧека(СтруктураДляПроверки)
УстановитьПривилегированныйРежим(Истина);
Объект = СтруктураДляПроверки.Объект;
ИмяТаблицыТоваров = СтруктураДляПроверки.ИмяТаблицыТоваров;
Отказ = СтруктураДляПроверки.Отказ;
ИтоговоеСообщение = СтруктураДляПроверки.ИтоговоеСообщение;
ДатаРасчета = СтруктураДляПроверки.ДатаРасчета;
Сообщать = СтруктураДляПроверки.Сообщать;
ОрганизацияЕГАИС = СтруктураДляПроверки.ОрганизацияЕГАИС;
ТаблицаАкцизныеМарки = Объект[ИмяТаблицыТоваров];
ТаблицаТовары = Объект.Товары;
АкцизныеМарки = Новый ТаблицаЗначений;
АкцизныеМарки.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
АкцизныеМарки.Колонки.Добавить("АкцизнаяМарка", Новый ОписаниеТипов("СправочникСсылка.ШтрихкодыУпаковокТоваров"));
Для Каждого АкцизнаяМарка Из ТаблицаАкцизныеМарки Цикл
НоваяСтрока = АкцизныеМарки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, АкцизнаяМарка);
КонецЦикла;
Организации = Новый ТаблицаЗначений;
Организации.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
Организации.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
Для Каждого Строка Из ТаблицаТовары Цикл
НоваяСтрока = Организации.Добавить();
НоваяСтрока.КлючСвязи = Строка.КлючСвязи;
Если ТипЗнч(Объект) = Тип("ДокументОбъект.ЧекККМ") Или ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваров") Тогда
НоваяСтрока.Организация = Объект.Организация;
Иначе
НоваяСтрока.Организация = Строка.Организация;
КонецЕсли;
КонецЦикла;
УсловиеЧек = "";
УсловиеЧекВозврат = "";
УсловиеРеализация = "";
ДокументСсылка = Объект.Ссылка;
Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ЧекККМ") Тогда
УсловиеЧек = "И ЧекККМАкцизныеМарки.Ссылка <> &ДокументСсылка";
УсловиеЧекВозврат = "И ЧекККМВозвратАкцизныеМарки.Ссылка <> &ДокументСсылка";
ИначеЕсли ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.РеализацияТоваров") Тогда
УсловиеРеализация = "И РеализацияТоваровАкцизныеМарки.Ссылка <> &ДокументСсылка";
КонецЕсли;
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
| АкцизныеМарки.КлючСвязи КАК КлючСвязи,
| АкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка
|ПОМЕСТИТЬ ТаблицаАкцизныеМарки
|ИЗ
| &АкцизныеМарки КАК АкцизныеМарки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Организации.КлючСвязи КАК КлючСвязи,
| Организации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизации
|ИЗ
| &Организации КАК Организации
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаАкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка,
| ТаблицаОрганизации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизацииИМарки
|ИЗ
| ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизации КАК ТаблицаОрганизации
| ПО ТаблицаАкцизныеМарки.КлючСвязи = ТаблицаОрганизации.КлючСвязи
|;
|
|////////////////////////////////////////////////////////////////////////////////
#Удаление
|ВЫБРАТЬ
| ЧекККМ.Ссылка КАК Ссылка,
| ЧекККМ.Дата КАК Дата,
| ЧекККМ.Номер КАК Номер,
| &Продажа КАК ПоследняяОперация
|ИЗ
| Документ.ЧекККМ.АкцизныеМарки КАК ЧекККМАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМ
| ПО ЧекККМАкцизныеМарки.Ссылка = ЧекККМ.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекККМАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ЧекККМ.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ЧекККМ.Проведен
| И ЧекККМ.ВидОперации = &Продажа
| И &УсловиеЧек
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекККМ.Ссылка,
| ЧекККМ.Дата,
| ЧекККМ.Номер,
| &Возврат
|ИЗ
| Документ.ЧекККМ.АкцизныеМарки КАК ЧекККМВозвратАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМ
| ПО ЧекККМВозвратАкцизныеМарки.Ссылка = ЧекККМ.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекККМВозвратАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ЧекККМ.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ЧекККМ.Проведен
| И ЧекККМ.ВидОперации = &Возврат
| И &УсловиеЧекВозврат
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекЕГАИС.Ссылка,
| ЧекЕГАИС.Дата,
| ЧекЕГАИС.Номер,
| &Продажа
|ИЗ
| Документ.ЧекЕГАИС.АкцизныеМарки КАК ЧекЕГАИСАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекЕГАИС КАК ЧекЕГАИС
| ПО ЧекЕГАИСАкцизныеМарки.Ссылка = ЧекЕГАИС.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекЕГАИСАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| ЧекЕГАИС.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваров.Ссылка,
| РеализацияТоваров.Дата,
| РеализацияТоваров.Номер,
| &Продажа
|ИЗ
| Документ.РеализацияТоваров.АкцизныеМарки КАК РеализацияТоваровАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО РеализацияТоваровАкцизныеМарки.Ссылка = РеализацияТоваров.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО РеализацияТоваровАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (РеализацияТоваров.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| РеализацияТоваров.Проведен
| И РеализацияТоваров.ПробитЧек
| И &УсловиеРеализация
#КонецУдаления
#Вставка
|ВЫБРАТЬ
| РеализацияТоваров.Ссылка КАК Ссылка,
| РеализацияТоваров.Дата КАК Дата,
| РеализацияТоваров.Номер КАК Номер,
| &Продажа КАК ПоследняяОперация
|ИЗ
| Документ.РеализацияТоваров.АкцизныеМарки КАК РеализацияТоваровАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО РеализацияТоваровАкцизныеМарки.Ссылка = РеализацияТоваров.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО РеализацияТоваровАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (РеализацияТоваров.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| РеализацияТоваров.Проведен
| И РеализацияТоваров.ПробитЧек
| И &УсловиеРеализация
#КонецВставки
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекЕГАИСВозврат.Ссылка,
| ЧекЕГАИСВозврат.Дата,
| ЧекЕГАИСВозврат.Номер,
| &Возврат
|ИЗ
| Документ.ЧекЕГАИСВозврат.АкцизныеМарки КАК ЧекЕГАИСВозвратАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекЕГАИСВозврат КАК ЧекЕГАИСВозврат
| ПО ЧекЕГАИСВозвратАкцизныеМарки.Ссылка = ЧекЕГАИСВозврат.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекЕГАИСВозвратАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| ЧекЕГАИСВозврат.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВозвратТоваровОтПокупателя.Ссылка,
| ВозвратТоваровОтПокупателя.Дата,
| ВозвратТоваровОтПокупателя.Номер,
| &Возврат
|ИЗ
| Документ.ВозвратТоваровОтПокупателя.АкцизныеМарки КАК ВозвратТоваровОтПокупателяАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.Ссылка = ВозвратТоваровОтПокупателя.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ВозвратТоваровОтПокупателя.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ВозвратТоваровОтПокупателя.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АктСписанияЕГАИС.Ссылка,
| АктСписанияЕГАИС.Дата,
| АктСписанияЕГАИС.Номер,
| &Продажа
|ИЗ
| Документ.АктСписанияЕГАИС.АкцизныеМарки КАК АктСписанияЕГАИСАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументовЕГАИС КАК СтатусыДокументовЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = СтатусыДокументовЕГАИС.Документ
| И (НЕ СтатусыДокументовЕГАИС.Статус В (&НевыгруженныеСтатусы))
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АктСписанияЕГАИС КАК АктСписанияЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = АктСписанияЕГАИС.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО АктСписанияЕГАИСАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| АктСписанияЕГАИС.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АкцизныеМаркиЕГАИС.Основание,
| АкцизныеМаркиЕГАИС.Основание.Дата,
| АкцизныеМаркиЕГАИС.Основание.Номер,
| &Продажа
|ИЗ
| РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ПО АкцизныеМаркиЕГАИС.АкцизнаяМарка = ТаблицаАкцизныеМарки.АкцизнаяМарка
|ГДЕ
| НЕ АкцизныеМаркиЕГАИС.Основание = &ДокументСсылка
| И АкцизныеМаркиЕГАИС.Статус = &Реализована
| И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ,
| Ссылка УБЫВ";
Если НЕ ЗначениеЗаполнено(ОрганизацияЕГАИС) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС", "");
Запрос.УстановитьПараметр("ОрганизацияЕГАИС", ОрганизацияЕГАИС);
Иначе
Запрос.УстановитьПараметр("ОрганизацияЕГАИС", ОрганизацияЕГАИС);
КонецЕсли;
НевыгруженныеСтатусы = Новый Массив;
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.ОшибкаПередачи);
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.ОшибкаПроведенияЕГАИС);
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.Отменен);
Запрос.УстановитьПараметр("НевыгруженныеСтатусы", НевыгруженныеСтатусы);
Запрос.УстановитьПараметр("Возврат", Перечисления.ВидыОперацийЧекККМ.Возврат);
Запрос.УстановитьПараметр("Продажа", Перечисления.ВидыОперацийЧекККМ.Продажа);
Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
Запрос.УстановитьПараметр("Реализована", Перечисления.СтатусыАкцизныхМарок.Реализована);
Запрос.УстановитьПараметр("АкцизныеМарки", АкцизныеМарки);
Запрос.УстановитьПараметр("Организации", Организации);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеРеализация", УсловиеРеализация);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеЧекВозврат", УсловиеЧекВозврат);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеЧек", УсловиеЧек);
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
Если Выборка.Следующий() Тогда
ЕстьОшибка = Ложь;
Если Выборка.ПоследняяОперация = Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
ЕстьОшибка = Истина;
КонецЕсли;
Если ЕстьОшибка Тогда
СтруктураДляПроверки.Отказ = Истина;
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(НСтр("ru = 'Присутствуют акцизные марки, которые '"));
МассивСтрок.Добавить(НСтр("ru = 'ранее были учтены в документах:'"));
МассивСтрок.Добавить(Символы.ПС);
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(
ОбщегоНазначенияРТ.ПолучитьПредставлениеДокумента(Выборка.Ссылка, Выборка.Номер, Выборка.Дата),,,,
ПолучитьНавигационнуюСсылку(Выборка.Ссылка)));
ТекстСообщения = Новый ФорматированнаяСтрока(МассивСтрок);
Если Сообщать Тогда
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Иначе
СтруктураДляПроверки.ИтоговоеСообщение = ИтоговоеСообщение + ТекстСообщения + Символы.ПС;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&Вместо("ПроверитьАкцизныеМаркиПередЗаписьюЧека")
Процедура уо_ПроверитьАкцизныеМаркиПередЗаписьюЧека(СтруктураДляПроверки)
УстановитьПривилегированныйРежим(Истина);
Объект = СтруктураДляПроверки.Объект;
ИмяТаблицыТоваров = СтруктураДляПроверки.ИмяТаблицыТоваров;
Отказ = СтруктураДляПроверки.Отказ;
ИтоговоеСообщение = СтруктураДляПроверки.ИтоговоеСообщение;
ДатаРасчета = СтруктураДляПроверки.ДатаРасчета;
Сообщать = СтруктураДляПроверки.Сообщать;
ОрганизацияЕГАИС = СтруктураДляПроверки.ОрганизацияЕГАИС;
ТаблицаАкцизныеМарки = Объект[ИмяТаблицыТоваров];
ТаблицаТовары = Объект.Товары;
АкцизныеМарки = Новый ТаблицаЗначений;
АкцизныеМарки.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
АкцизныеМарки.Колонки.Добавить("АкцизнаяМарка", Новый ОписаниеТипов("СправочникСсылка.ШтрихкодыУпаковокТоваров"));
Для Каждого АкцизнаяМарка Из ТаблицаАкцизныеМарки Цикл
НоваяСтрока = АкцизныеМарки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, АкцизнаяМарка);
КонецЦикла;
Организации = Новый ТаблицаЗначений;
Организации.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
Организации.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
Для Каждого Строка Из ТаблицаТовары Цикл
НоваяСтрока = Организации.Добавить();
НоваяСтрока.КлючСвязи = Строка.КлючСвязи;
Если ТипЗнч(Объект) = Тип("ДокументОбъект.ЧекККМ") Или ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваров") Тогда
НоваяСтрока.Организация = Объект.Организация;
Иначе
НоваяСтрока.Организация = Строка.Организация;
КонецЕсли;
КонецЦикла;
УсловиеЧек = "";
УсловиеЧекВозврат = "";
УсловиеРеализация = "";
ДокументСсылка = Объект.Ссылка;
Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ЧекККМ") Тогда
УсловиеЧек = "И ЧекККМАкцизныеМарки.Ссылка <> &ДокументСсылка";
УсловиеЧекВозврат = "И ЧекККМВозвратАкцизныеМарки.Ссылка <> &ДокументСсылка";
ИначеЕсли ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.РеализацияТоваров") Тогда
УсловиеРеализация = "И РеализацияТоваровАкцизныеМарки.Ссылка <> &ДокументСсылка";
КонецЕсли;
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
| АкцизныеМарки.КлючСвязи КАК КлючСвязи,
| АкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка
|ПОМЕСТИТЬ ТаблицаАкцизныеМарки
|ИЗ
| &АкцизныеМарки КАК АкцизныеМарки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Организации.КлючСвязи КАК КлючСвязи,
| Организации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизации
|ИЗ
| &Организации КАК Организации
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаАкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка,
| ТаблицаОрганизации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизацииИМарки
|ИЗ
| ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизации КАК ТаблицаОрганизации
| ПО ТаблицаАкцизныеМарки.КлючСвязи = ТаблицаОрганизации.КлючСвязи
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РеализацияТоваров.Ссылка КАК Ссылка,
| РеализацияТоваров.Дата КАК Дата,
| РеализацияТоваров.Номер КАК Номер,
| &Продажа КАК ПоследняяОперация
|ИЗ
| Документ.РеализацияТоваров.АкцизныеМарки КАК РеализацияТоваровАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО РеализацияТоваровАкцизныеМарки.Ссылка = РеализацияТоваров.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО РеализацияТоваровАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (РеализацияТоваров.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| РеализацияТоваров.Проведен
| И РеализацияТоваров.ПробитЧек
| И &УсловиеРеализация
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекЕГАИСВозврат.Ссылка,
| ЧекЕГАИСВозврат.Дата,
| ЧекЕГАИСВозврат.Номер,
| &Возврат
|ИЗ
| Документ.ЧекЕГАИСВозврат.АкцизныеМарки КАК ЧекЕГАИСВозвратАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекЕГАИСВозврат КАК ЧекЕГАИСВозврат
| ПО ЧекЕГАИСВозвратАкцизныеМарки.Ссылка = ЧекЕГАИСВозврат.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекЕГАИСВозвратАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| ЧекЕГАИСВозврат.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВозвратТоваровОтПокупателя.Ссылка,
| ВозвратТоваровОтПокупателя.Дата,
| ВозвратТоваровОтПокупателя.Номер,
| &Возврат
|ИЗ
| Документ.ВозвратТоваровОтПокупателя.АкцизныеМарки КАК ВозвратТоваровОтПокупателяАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.Ссылка = ВозвратТоваровОтПокупателя.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ВозвратТоваровОтПокупателя.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ВозвратТоваровОтПокупателя.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АктСписанияЕГАИС.Ссылка,
| АктСписанияЕГАИС.Дата,
| АктСписанияЕГАИС.Номер,
| &Продажа
|ИЗ
| Документ.АктСписанияЕГАИС.АкцизныеМарки КАК АктСписанияЕГАИСАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументовЕГАИС КАК СтатусыДокументовЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = СтатусыДокументовЕГАИС.Документ
| И (НЕ СтатусыДокументовЕГАИС.Статус В (&НевыгруженныеСтатусы))
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АктСписанияЕГАИС КАК АктСписанияЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = АктСписанияЕГАИС.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО АктСписанияЕГАИСАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| АктСписанияЕГАИС.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АкцизныеМаркиЕГАИС.Основание,
| АкцизныеМаркиЕГАИС.Основание.Дата,
| АкцизныеМаркиЕГАИС.Основание.Номер,
| &Продажа
|ИЗ
| РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ПО АкцизныеМаркиЕГАИС.АкцизнаяМарка = ТаблицаАкцизныеМарки.АкцизнаяМарка
|ГДЕ
| НЕ АкцизныеМаркиЕГАИС.Основание = &ДокументСсылка
| И АкцизныеМаркиЕГАИС.Статус = &Реализована
| И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ,
| Ссылка УБЫВ";
Если НЕ ЗначениеЗаполнено(ОрганизацияЕГАИС) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС", "");
Запрос.УстановитьПараметр("ОрганизацияЕГАИС", ОрганизацияЕГАИС);
Иначе
Запрос.УстановитьПараметр("ОрганизацияЕГАИС", ОрганизацияЕГАИС);
КонецЕсли;
НевыгруженныеСтатусы = Новый Массив;
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.ОшибкаПередачи);
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.ОшибкаПроведенияЕГАИС);
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.Отменен);
Запрос.УстановитьПараметр("НевыгруженныеСтатусы", НевыгруженныеСтатусы);
Запрос.УстановитьПараметр("Возврат", Перечисления.ВидыОперацийЧекККМ.Возврат);
Запрос.УстановитьПараметр("Продажа", Перечисления.ВидыОперацийЧекККМ.Продажа);
Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
Запрос.УстановитьПараметр("Реализована", Перечисления.СтатусыАкцизныхМарок.Реализована);
Запрос.УстановитьПараметр("АкцизныеМарки", АкцизныеМарки);
Запрос.УстановитьПараметр("Организации", Организации);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеРеализация", УсловиеРеализация);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеЧекВозврат", УсловиеЧекВозврат);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеЧек", УсловиеЧек);
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
Если Выборка.Следующий() Тогда
ЕстьОшибка = Ложь;
Если Выборка.ПоследняяОперация = Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
ЕстьОшибка = Истина;
КонецЕсли;
Если ЕстьОшибка Тогда
СтруктураДляПроверки.Отказ = Истина;
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(НСтр("ru = 'Присутствуют акцизные марки, которые '"));
МассивСтрок.Добавить(НСтр("ru = 'ранее были учтены в документах:'"));
МассивСтрок.Добавить(Символы.ПС);
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(
ОбщегоНазначенияРТ.ПолучитьПредставлениеДокумента(Выборка.Ссылка, Выборка.Номер, Выборка.Дата),,,,
ПолучитьНавигационнуюСсылку(Выборка.Ссылка)));
ТекстСообщения = Новый ФорматированнаяСтрока(МассивСтрок);
Если Сообщать Тогда
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Иначе
СтруктураДляПроверки.ИтоговоеСообщение = ИтоговоеСообщение + ТекстСообщения + Символы.ПС;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&ИзменениеИКонтроль("ПроверитьАкцизныеМаркиПередЗаписьюЧека")
Процедура Расш1_ПроверитьАкцизныеМаркиПередЗаписьюЧека(СтруктураДляПроверки)
УстановитьПривилегированныйРежим(Истина);
Объект = СтруктураДляПроверки.Объект;
ИмяТаблицыТоваров = СтруктураДляПроверки.ИмяТаблицыТоваров;
Отказ = СтруктураДляПроверки.Отказ;
ИтоговоеСообщение = СтруктураДляПроверки.ИтоговоеСообщение;
ДатаРасчета = СтруктураДляПроверки.ДатаРасчета;
Сообщать = СтруктураДляПроверки.Сообщать;
ОрганизацияЕГАИС = СтруктураДляПроверки.ОрганизацияЕГАИС;
ТаблицаАкцизныеМарки = Объект[ИмяТаблицыТоваров];
ТаблицаТовары = Объект.Товары;
АкцизныеМарки = Новый ТаблицаЗначений;
АкцизныеМарки.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
АкцизныеМарки.Колонки.Добавить("АкцизнаяМарка", Новый ОписаниеТипов("СправочникСсылка.ШтрихкодыУпаковокТоваров"));
Для Каждого АкцизнаяМарка Из ТаблицаАкцизныеМарки Цикл
НоваяСтрока = АкцизныеМарки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, АкцизнаяМарка);
КонецЦикла;
Организации = Новый ТаблицаЗначений;
Организации.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
Организации.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
Для Каждого Строка Из ТаблицаТовары Цикл
НоваяСтрока = Организации.Добавить();
НоваяСтрока.КлючСвязи = Строка.КлючСвязи;
Если ТипЗнч(Объект) = Тип("ДокументОбъект.ЧекККМ")
Или ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваров")
Или ТипЗнч(Объект) = Тип("ДокументОбъект.ПеремещениеТоваров") Тогда
НоваяСтрока.Организация = Объект.Организация;
Иначе
НоваяСтрока.Организация = Строка.Организация;
КонецЕсли;
КонецЦикла;
УсловиеЧек = "";
УсловиеЧекВозврат = "";
УсловиеРеализация = "";
ДокументСсылка = Объект.Ссылка;
Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ЧекККМ") Тогда
УсловиеЧек = "И ЧекККМАкцизныеМарки.Ссылка <> &ДокументСсылка";
УсловиеЧекВозврат = "И ЧекККМВозвратАкцизныеМарки.Ссылка <> &ДокументСсылка";
ИначеЕсли ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.РеализацияТоваров") Тогда
УсловиеРеализация = "И РеализацияТоваровАкцизныеМарки.Ссылка <> &ДокументСсылка";
КонецЕсли;
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
| АкцизныеМарки.КлючСвязи КАК КлючСвязи,
| АкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка
|ПОМЕСТИТЬ ТаблицаАкцизныеМарки
|ИЗ
| &АкцизныеМарки КАК АкцизныеМарки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Организации.КлючСвязи КАК КлючСвязи,
| Организации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизации
|ИЗ
| &Организации КАК Организации
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаАкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка,
| ТаблицаОрганизации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизацииИМарки
|ИЗ
| ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизации КАК ТаблицаОрганизации
| ПО ТаблицаАкцизныеМарки.КлючСвязи = ТаблицаОрганизации.КлючСвязи
|
|ИНДЕКСИРОВАТЬ ПО
| АкцизнаяМарка,
| Организация
|;
|
|////////////////////////////////////////////////////////////////////////////////
#Удаление
|ВЫБРАТЬ
| ЧекККМ.Ссылка КАК Ссылка,
| ЧекККМ.Дата КАК Дата,
| ЧекККМ.Номер КАК Номер,
| &Продажа КАК ПоследняяОперация
|ИЗ
| Документ.ЧекККМ.АкцизныеМарки КАК ЧекККМАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМ
| ПО ЧекККМАкцизныеМарки.Ссылка = ЧекККМ.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекККМАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ЧекККМ.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ЧекККМ.Проведен
| И ЧекККМ.ВидОперации = &Продажа
| И &УсловиеЧек
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекККМ.Ссылка,
| ЧекККМ.Дата,
| ЧекККМ.Номер,
| &Возврат
|ИЗ
| Документ.ЧекККМ.АкцизныеМарки КАК ЧекККМВозвратАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМ
| ПО ЧекККМВозвратАкцизныеМарки.Ссылка = ЧекККМ.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекККМВозвратАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ЧекККМ.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ЧекККМ.Проведен
| И ЧекККМ.ВидОперации = &Возврат
| И &УсловиеЧекВозврат
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекЕГАИС.Ссылка,
| ЧекЕГАИС.Дата,
| ЧекЕГАИС.Номер,
| &Продажа
|ИЗ
| Документ.ЧекЕГАИС.АкцизныеМарки КАК ЧекЕГАИСАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекЕГАИС КАК ЧекЕГАИС
| ПО ЧекЕГАИСАкцизныеМарки.Ссылка = ЧекЕГАИС.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекЕГАИСАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| ЧекЕГАИС.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваров.Ссылка,
| РеализацияТоваров.Дата,
| РеализацияТоваров.Номер,
| &Продажа
|ИЗ
| Документ.РеализацияТоваров.АкцизныеМарки КАК РеализацияТоваровАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО РеализацияТоваровАкцизныеМарки.Ссылка = РеализацияТоваров.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО РеализацияТоваровАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (РеализацияТоваров.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| РеализацияТоваров.Проведен
| И РеализацияТоваров.УдалитьПробитЧек
| И &УсловиеРеализация
|
|ОБЪЕДИНИТЬ ВСЕ
|
#КонецУдаления
#Вставка
|ВЫБРАТЬ
| РеализацияТоваров.Ссылка КАК Ссылка,
| РеализацияТоваров.Дата КАК Дата,
| РеализацияТоваров.Номер КАК Номер,
| &Продажа КАК ПоследняяОперация
|ИЗ
| Документ.РеализацияТоваров.АкцизныеМарки КАК РеализацияТоваровАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО РеализацияТоваровАкцизныеМарки.Ссылка = РеализацияТоваров.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО РеализацияТоваровАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (РеализацияТоваров.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| РеализацияТоваров.Проведен
| И РеализацияТоваров.УдалитьПробитЧек
| И &УсловиеРеализация
|
|ОБЪЕДИНИТЬ ВСЕ
|
#КонецВставки
|ВЫБРАТЬ
| ЧекЕГАИСВозврат.Ссылка,
| ЧекЕГАИСВозврат.Дата,
| ЧекЕГАИСВозврат.Номер,
| &Возврат
|ИЗ
| Документ.ЧекЕГАИСВозврат.АкцизныеМарки КАК ЧекЕГАИСВозвратАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекЕГАИСВозврат КАК ЧекЕГАИСВозврат
| ПО ЧекЕГАИСВозвратАкцизныеМарки.Ссылка = ЧекЕГАИСВозврат.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекЕГАИСВозвратАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| ЧекЕГАИСВозврат.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВозвратТоваровОтПокупателя.Ссылка,
| ВозвратТоваровОтПокупателя.Дата,
| ВозвратТоваровОтПокупателя.Номер,
| &Возврат
|ИЗ
| Документ.ВозвратТоваровОтПокупателя.АкцизныеМарки КАК ВозвратТоваровОтПокупателяАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.Ссылка = ВозвратТоваровОтПокупателя.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ВозвратТоваровОтПокупателя.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ВозвратТоваровОтПокупателя.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АктСписанияЕГАИС.Ссылка,
| АктСписанияЕГАИС.Дата,
| АктСписанияЕГАИС.Номер,
| &Продажа
|ИЗ
| Документ.АктСписанияЕГАИС.АкцизныеМарки КАК АктСписанияЕГАИСАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументовЕГАИС КАК СтатусыДокументовЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = СтатусыДокументовЕГАИС.Документ
| И (НЕ СтатусыДокументовЕГАИС.Статус В (&НевыгруженныеСтатусы))
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АктСписанияЕГАИС КАК АктСписанияЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = АктСписанияЕГАИС.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО АктСписанияЕГАИСАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| АктСписанияЕГАИС.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АкцизныеМаркиЕГАИС.Основание,
| АкцизныеМаркиЕГАИС.Основание.Дата,
| АкцизныеМаркиЕГАИС.Основание.Номер,
| &Продажа
|ИЗ
| РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ПО АкцизныеМаркиЕГАИС.АкцизнаяМарка = ТаблицаАкцизныеМарки.АкцизнаяМарка
|ГДЕ
| НЕ АкцизныеМаркиЕГАИС.Основание = &ДокументСсылка
| И АкцизныеМаркиЕГАИС.Статус = &Реализована
| И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ,
| Ссылка УБЫВ";
Если НЕ ЗначениеЗаполнено(ОрганизацияЕГАИС) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС", "");
Запрос.УстановитьПараметр("ОрганизацияЕГАИС", ОрганизацияЕГАИС);
Иначе
Запрос.УстановитьПараметр("ОрганизацияЕГАИС", ОрганизацияЕГАИС);
КонецЕсли;
НевыгруженныеСтатусы = Новый Массив;
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.ОшибкаПередачи);
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.ОшибкаПроведенияЕГАИС);
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.Отменен);
Запрос.УстановитьПараметр("НевыгруженныеСтатусы", НевыгруженныеСтатусы);
Запрос.УстановитьПараметр("Возврат", Перечисления.ВидыОперацийЧекККМ.Возврат);
Запрос.УстановитьПараметр("Продажа", Перечисления.ВидыОперацийЧекККМ.Продажа);
Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
Запрос.УстановитьПараметр("Реализована", Перечисления.СтатусыАкцизныхМарок.Реализована);
Запрос.УстановитьПараметр("АкцизныеМарки", АкцизныеМарки);
Запрос.УстановитьПараметр("Организации", Организации);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеРеализация", УсловиеРеализация);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеЧекВозврат", УсловиеЧекВозврат);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеЧек", УсловиеЧек);
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
Если Выборка.Следующий() Тогда
ЕстьОшибка = Ложь;
Если Выборка.ПоследняяОперация = Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
ЕстьОшибка = Истина;
КонецЕсли;
Если ЕстьОшибка Тогда
СтруктураДляПроверки.Отказ = Истина;
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(НСтр("ru = 'Присутствуют акцизные марки, которые '"));
МассивСтрок.Добавить(НСтр("ru = 'ранее были учтены в документах:'"));
МассивСтрок.Добавить(Символы.ПС);
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(
ОбщегоНазначенияРТ.ПредставлениеДокумента(Выборка.Ссылка, Выборка.Номер, Выборка.Дата),,,,
ПолучитьНавигационнуюСсылку(Выборка.Ссылка)));
ТекстСообщения = Новый ФорматированнаяСтрока(МассивСтрок);
Если Сообщать Тогда
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Иначе
СтруктураДляПроверки.ИтоговоеСообщение = ИтоговоеСообщение + ТекстСообщения + Символы.ПС;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&Вместо("ПроверитьАкцизныеМаркиПередЗаписьюЧека")
Процедура Расш1_ПроверитьАкцизныеМаркиПередЗаписьюЧека(СтруктураДляПроверки)
УстановитьПривилегированныйРежим(Истина);
Объект = СтруктураДляПроверки.Объект;
ИмяТаблицыТоваров = СтруктураДляПроверки.ИмяТаблицыТоваров;
Отказ = СтруктураДляПроверки.Отказ;
ИтоговоеСообщение = СтруктураДляПроверки.ИтоговоеСообщение;
ДатаРасчета = СтруктураДляПроверки.ДатаРасчета;
Сообщать = СтруктураДляПроверки.Сообщать;
ОрганизацияЕГАИС = СтруктураДляПроверки.ОрганизацияЕГАИС;
ТаблицаАкцизныеМарки = Объект[ИмяТаблицыТоваров];
ТаблицаТовары = Объект.Товары;
АкцизныеМарки = Новый ТаблицаЗначений;
АкцизныеМарки.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
АкцизныеМарки.Колонки.Добавить("АкцизнаяМарка", Новый ОписаниеТипов("СправочникСсылка.ШтрихкодыУпаковокТоваров"));
Для Каждого АкцизнаяМарка Из ТаблицаАкцизныеМарки Цикл
НоваяСтрока = АкцизныеМарки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, АкцизнаяМарка);
КонецЦикла;
Организации = Новый ТаблицаЗначений;
Организации.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
Организации.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
Для Каждого Строка Из ТаблицаТовары Цикл
НоваяСтрока = Организации.Добавить();
НоваяСтрока.КлючСвязи = Строка.КлючСвязи;
Если ТипЗнч(Объект) = Тип("ДокументОбъект.ЧекККМ")
Или ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваров")
Или ТипЗнч(Объект) = Тип("ДокументОбъект.ПеремещениеТоваров") Тогда
НоваяСтрока.Организация = Объект.Организация;
Иначе
НоваяСтрока.Организация = Строка.Организация;
КонецЕсли;
КонецЦикла;
УсловиеЧек = "";
УсловиеЧекВозврат = "";
УсловиеРеализация = "";
ДокументСсылка = Объект.Ссылка;
Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ЧекККМ") Тогда
УсловиеЧек = "И ЧекККМАкцизныеМарки.Ссылка <> &ДокументСсылка";
УсловиеЧекВозврат = "И ЧекККМВозвратАкцизныеМарки.Ссылка <> &ДокументСсылка";
ИначеЕсли ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.РеализацияТоваров") Тогда
УсловиеРеализация = "И РеализацияТоваровАкцизныеМарки.Ссылка <> &ДокументСсылка";
КонецЕсли;
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
| АкцизныеМарки.КлючСвязи КАК КлючСвязи,
| АкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка
|ПОМЕСТИТЬ ТаблицаАкцизныеМарки
|ИЗ
| &АкцизныеМарки КАК АкцизныеМарки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Организации.КлючСвязи КАК КлючСвязи,
| Организации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизации
|ИЗ
| &Организации КАК Организации
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаАкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка,
| ТаблицаОрганизации.Организация КАК Организация
|ПОМЕСТИТЬ ТаблицаОрганизацииИМарки
|ИЗ
| ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизации КАК ТаблицаОрганизации
| ПО ТаблицаАкцизныеМарки.КлючСвязи = ТаблицаОрганизации.КлючСвязи
|
|ИНДЕКСИРОВАТЬ ПО
| АкцизнаяМарка,
| Организация
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РеализацияТоваров.Ссылка КАК Ссылка,
| РеализацияТоваров.Дата КАК Дата,
| РеализацияТоваров.Номер КАК Номер,
| &Продажа КАК ПоследняяОперация
|ИЗ
| Документ.РеализацияТоваров.АкцизныеМарки КАК РеализацияТоваровАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО РеализацияТоваровАкцизныеМарки.Ссылка = РеализацияТоваров.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО РеализацияТоваровАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (РеализацияТоваров.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| РеализацияТоваров.Проведен
| И РеализацияТоваров.УдалитьПробитЧек
| И &УсловиеРеализация
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЧекЕГАИСВозврат.Ссылка,
| ЧекЕГАИСВозврат.Дата,
| ЧекЕГАИСВозврат.Номер,
| &Возврат
|ИЗ
| Документ.ЧекЕГАИСВозврат.АкцизныеМарки КАК ЧекЕГАИСВозвратАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекЕГАИСВозврат КАК ЧекЕГАИСВозврат
| ПО ЧекЕГАИСВозвратАкцизныеМарки.Ссылка = ЧекЕГАИСВозврат.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ЧекЕГАИСВозвратАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| ЧекЕГАИСВозврат.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВозвратТоваровОтПокупателя.Ссылка,
| ВозвратТоваровОтПокупателя.Дата,
| ВозвратТоваровОтПокупателя.Номер,
| &Возврат
|ИЗ
| Документ.ВозвратТоваровОтПокупателя.АкцизныеМарки КАК ВозвратТоваровОтПокупателяАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.Ссылка = ВозвратТоваровОтПокупателя.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО ВозвратТоваровОтПокупателяАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
| И (ВозвратТоваровОтПокупателя.Организация = ТаблицаОрганизацииИМарки.Организация)
|ГДЕ
| ВозвратТоваровОтПокупателя.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АктСписанияЕГАИС.Ссылка,
| АктСписанияЕГАИС.Дата,
| АктСписанияЕГАИС.Номер,
| &Продажа
|ИЗ
| Документ.АктСписанияЕГАИС.АкцизныеМарки КАК АктСписанияЕГАИСАкцизныеМарки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументовЕГАИС КАК СтатусыДокументовЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = СтатусыДокументовЕГАИС.Документ
| И (НЕ СтатусыДокументовЕГАИС.Статус В (&НевыгруженныеСтатусы))
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АктСписанияЕГАИС КАК АктСписанияЕГАИС
| ПО АктСписанияЕГАИСАкцизныеМарки.Ссылка = АктСписанияЕГАИС.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОрганизацииИМарки КАК ТаблицаОрганизацииИМарки
| ПО АктСписанияЕГАИСАкцизныеМарки.АкцизнаяМарка = ТаблицаОрганизацииИМарки.АкцизнаяМарка
|ГДЕ
| АктСписанияЕГАИС.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АкцизныеМаркиЕГАИС.Основание,
| АкцизныеМаркиЕГАИС.Основание.Дата,
| АкцизныеМаркиЕГАИС.Основание.Номер,
| &Продажа
|ИЗ
| РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаАкцизныеМарки КАК ТаблицаАкцизныеМарки
| ПО АкцизныеМаркиЕГАИС.АкцизнаяМарка = ТаблицаАкцизныеМарки.АкцизнаяМарка
|ГДЕ
| НЕ АкцизныеМаркиЕГАИС.Основание = &ДокументСсылка
| И АкцизныеМаркиЕГАИС.Статус = &Реализована
| И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ,
| Ссылка УБЫВ";
Если НЕ ЗначениеЗаполнено(ОрганизацияЕГАИС) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС = &ОрганизацияЕГАИС", "");
Запрос.УстановитьПараметр("ОрганизацияЕГАИС", ОрганизацияЕГАИС);
Иначе
Запрос.УстановитьПараметр("ОрганизацияЕГАИС", ОрганизацияЕГАИС);
КонецЕсли;
НевыгруженныеСтатусы = Новый Массив;
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.ОшибкаПередачи);
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.ОшибкаПроведенияЕГАИС);
НевыгруженныеСтатусы.Добавить(Перечисления.СтатусыОбработкиАктаСписанияЕГАИС.Отменен);
Запрос.УстановитьПараметр("НевыгруженныеСтатусы", НевыгруженныеСтатусы);
Запрос.УстановитьПараметр("Возврат", Перечисления.ВидыОперацийЧекККМ.Возврат);
Запрос.УстановитьПараметр("Продажа", Перечисления.ВидыОперацийЧекККМ.Продажа);
Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
Запрос.УстановитьПараметр("Реализована", Перечисления.СтатусыАкцизныхМарок.Реализована);
Запрос.УстановитьПараметр("АкцизныеМарки", АкцизныеМарки);
Запрос.УстановитьПараметр("Организации", Организации);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеРеализация", УсловиеРеализация);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеЧекВозврат", УсловиеЧекВозврат);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеЧек", УсловиеЧек);
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
Если Выборка.Следующий() Тогда
ЕстьОшибка = Ложь;
Если Выборка.ПоследняяОперация = Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
ЕстьОшибка = Истина;
КонецЕсли;
Если ЕстьОшибка Тогда
СтруктураДляПроверки.Отказ = Истина;
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(НСтр("ru = 'Присутствуют акцизные марки, которые '"));
МассивСтрок.Добавить(НСтр("ru = 'ранее были учтены в документах:'"));
МассивСтрок.Добавить(Символы.ПС);
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(
ОбщегоНазначенияРТ.ПредставлениеДокумента(Выборка.Ссылка, Выборка.Номер, Выборка.Дата),,,,
ПолучитьНавигационнуюСсылку(Выборка.Ссылка)));
ТекстСообщения = Новый ФорматированнаяСтрока(МассивСтрок);
Если Сообщать Тогда
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Иначе
СтруктураДляПроверки.ИтоговоеСообщение = ИтоговоеСообщение + ТекстСообщения + Символы.ПС;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом случае риски все те же: у вас проверка не будет проводиться по чекам ККМ. Для примера приведу замеры выполнения типового запроса и запроса, измененного расширением. В обоих случаях использовалась одна и та же база, в чек добавлялась одна и та же марка; для тестов использовалась 1С:Розница версии 2.2.13.12 в файловом варианте, загрузка ПК была в обоих случаях примерно одинаковой:
Как видим, разница колоссальная! У некоторых время выполнения типового запроса достигала порядка 200-300 сек, в зависимости от "железа" и количества чеков в базе. Только представьте: у вас покупатель будет ждать 3-5 минут, пока кассир сможет принять у него оплату!
Минимизация рисков
Как уже отметил вышел, вы должны четко понимать, какие риски вы принимаете на себя, если будете использовать вышеприведенные варианты. Во-первых, нельзя исключать, что у вас вдруг окажется реализованная ранее марка старого образца, а при продаже УТМ не сможет ее проверить; да, вероятность мизерная, но надо понимать, что она все-таки существует. Во-вторых, при использовании вариантов 1 и 2 вы потеряете архивные чеки: это может создать некоторые неудобства, например, при оформлении возвратов. Для минимизации рисков повторной продажи в любом из приведенных вариантах поможет внесение тем или иным способом статусов реализованных ранее марок старого образца в регистр сведений "Акцизные марки ЕГАИС". Но об этом поговорим позже...
Бонус: к статье прикреплены расширения для реализации 3 варианта с использованием совместно с платформой 8.3.15 для версий 2.3.2.28 и 2.2.13.12