Два склада - одна касса и наоборот [УТ10.3]

1. AlexeyPapanov 460 08.06.16 08:08 Сейчас в теме
Всем привет!
две типовых ситуации хочу рассмотреть на примере УТ 10.3:

1. "Два склада и одна касса ККМ"
У фирмы есть один склад (оптовый), одна касса ККМ, один фискальный регистратор.
Если мы хотим добавить еще один склад, надо ли нам создавать еще одну кассу ККМ?
Ведь при закрытии кассовой смены мы в документе можем указать только кассу ККМ, склад выбрать нельзя. И выходит, что при закрытии кассовой смены в отчет о розничных продажах попадет все по двум складам.
Выход я вижу такой - на каждый склад делать кассу ККМ.
Можно ли тогда один и тот же фискальный регистратор завязать на более чем одну кассу ККМ?
Касса ККМ №1 -> ФР
Касса ККМ №2 -> ФР
Мы создаем чек ККМ и просто выбираем в нем кассу и склад.
Вознаграждение за ответ
Показать полностью
Найденные решения
5. Shevon 1 08.06.16 09:31 Сейчас в теме
1. Два ККМ - один склад и наоборот:
Я это реализовывал следующим образом:
- В табличной части документа "Чек ККМ" нужно добавить поле "Склад"
- Создавал Регистр сведений "СкладыРеализации" с измерениями "Номенклатурная группа", "Касса ККМ" и ресурсом "Склад"
- При добавлении товара в чек кКМ (в фронте кассира) определял из этого регистра сведений склад списания для позиции.
- При закрытии (свертка чеков) смены группировку производил по складу в табличной части чека
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. CaptainMorgan 09.06.16 08:24 Сейчас в теме
(1) По правде сказать, ни совсем понял что вы конкретно хотите. Просто порассуждать на эту тему?
Вы пишите "У фирмы есть один склад (оптовый), одна касса ККМ, один фискальный регистратор.
Если мы хотим добавить еще один склад, надо ли нам создавать еще одну кассу ККМ?"

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

Оптовый склад для продаж контрагентам, с которыми заключены договора.

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

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

Для этих целей пишется несложная обработка, которая запускается ночью автоматически.
10. AlexeyPapanov 460 09.06.16 09:07 Сейчас в теме
(8) CaptainMorgan, я не порассуждать пришел. У меня конкретная задача. Более актуален сейчас первый случай (два склада и один ФР).
Задача сводится к тому, чтобы обеспечить учет товара по двум складам, с которых будут идти продажи (общий склад и витрина). Но фискальник один. Я же не буду второй покупать ;)
(5) Shevon, да, вот это я и хотел. Я понял, что мне надо свернуть чеки по складам.
Только схема с регистром сведений мне особо не нужна. Так что склад я могу брать не из ТЧ чека ККМ, а просто из реквизита шапки.

А вы бы не могли поделиться кодом процедуры ОбработкаЧековККМ? Если оно мне поможет, я отблагодарю.
Я знаю, что эта процедура делает выборку чеков ККМ и их свертку в отчет о розничных продажах. Не могу пока продумать логику разделения на несколько отчетов о розничных продажах. Там же не только ТЧ Товары надо перенести, а еще и оплаты картами и прочее.

У меня мысль такаяя: код процедуры ОбработкаЧековККМ() запихнуть в цикл. Т.е. для каждого склада запускать обработку чеков ККМ так, чтобы выборка и обработка чеков шла по текущему складу.
типа такого:

Для каждого ТекСклад их СкладыПродажи Цикл
	//Выбираем чеки где склад = ТекСклад
	//Обрабатываем выборку и создаем отчет о розничных продажах
КонецЦикла;
2. AlexeyPapanov 460 08.06.16 08:18 Сейчас в теме
Второй случай обратный.

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

Как я понимаю схема такая

Склад №1 -> Касса ККМ №1 -> ФР
Склад №2 -> Касса ККМ №2 -> ПД (принтер документов)

Получается, чтобы контролировать остатки товаров, надо каждый день при закрытии смены на "левой" кассе делать внутреннее перемещение товара с первого склада на второй? А на втором мы должны разрешить списание в минус, чтобы чеки проводить без остатка.
3. alanto23 35 08.06.16 08:40 Сейчас в теме
(2) El_Loco, у нас была схожая ситуация - один фискальник и 2 вида услуг: услуги зала и прием оплаты сотовых операторов. (Давно это было, еще карточки оплаты продавали...) Мы просто-напросто в стандартной обработке на ККМ поправили разделение на отделы: там стоит по ставке НДС, а мы сделали по виду услуг. Это правда еще на ТиС 7.7 было. Ну я думаю принцип сохранился. Две строчки кода поправить пришлось всего. И при Х-отчете и при закрытии смены он выдает раздельные чеки.
4. AlexeyPapanov 460 08.06.16 09:10 Сейчас в теме
(3) alanto23, да, я сейчас понял, что вариант, который я описал в (1) посте не сработает. Я то думал, что я по 1-й кассе сниму Z-отчет, потом по 2-й...
Но при закрытии смены ФР у себя тоже смену должен закрыть, т.е. второй раз ему Z-отчет не отправишь, это же не просто принтер документов...

Поэтому разделение на два склада должно происходить в процедуре закрытия смены. Т.е. надо переписать код, чтобы отдельно создавались отчеты о розничных продажах по каждому складу.
5. Shevon 1 08.06.16 09:31 Сейчас в теме
1. Два ККМ - один склад и наоборот:
Я это реализовывал следующим образом:
- В табличной части документа "Чек ККМ" нужно добавить поле "Склад"
- Создавал Регистр сведений "СкладыРеализации" с измерениями "Номенклатурная группа", "Касса ККМ" и ресурсом "Склад"
- При добавлении товара в чек кКМ (в фронте кассира) определял из этого регистра сведений склад списания для позиции.
- При закрытии (свертка чеков) смены группировку производил по складу в табличной части чека
6. Shevon 1 08.06.16 09:36 Сейчас в теме
Таким образом максимально нейтрализовывал человеческий фактор. Кассир не должен заботиться с какого ему склада производить списание.
7. Shevon 1 08.06.16 09:48 Сейчас в теме
Второй случай обратный.

У фирмы стоит один фискальник нормальный, второй "левый" (точнее - не фискальник, а принтер чеков).


Делал это заведением еще одного ККМ для пользователя(кассира) в планах видов характеристик->настройки пользователя. При пробитии с помощью птичек или заученных комбинаций клавиш кассир выбирает какой чек ему бить. закрывает смену он дважды (по обоим регистраторам поочередно).
toleg1001; +1 Ответить
9. c300pm 09.06.16 08:50 Сейчас в теме
один склад-два ккм я делал так: создал 2-х пользователей касса1 и касса2, в настройках пользователя указал каждому свой основной склад и основную кассу ккм, ну и другие настройки по необходимости, таким образом, на 1-й кассе заходит пользователь под касса1, создает документ- там и склад и ккм и все что нужно уже заполнено по умолчанию, заходит касса2 - все по аналогии.
при закрытии смены на каждой кассе в базе создается по одному документу отчет о розничных продажах с одни складом, но с разными ккм.
когда один ккм-два склада просто при продаже выбирайте нужный склад в документе "чек ккм" и все, предполагаю, что при закрытии смены будут формироваться так же два документа отчет о розничных продажах но теперь уже с одним складом, но разными ккм
11. AlexeyPapanov 460 09.06.16 09:22 Сейчас в теме
Я сейчас увидел, что там имеется в отчете о розничных продажах реквизит в ТЧ товары - Склад.
и в зависимости от переменной мСкладыВТабличнойЧасти склад пишется либо ТЧ, либо в шапку отчета.

сама переменная вычисляется в модуле так:
УказаниеСкладов          = Константы.УказаниеСкладовВТабличнойЧастиДокументов.Получить();
мСкладыВТабличнойЧасти   = (УказаниеСкладов = Перечисления.ВариантыУказанияСкладовВТабличнойЧастиДокументов.ДляДокументовПоступленияРеализации
                        Или УказаниеСкладов = Перечисления.ВариантыУказанияСкладовВТабличнойЧастиДокументов.ДляДокументовРеализации);

я так понимаю, что эта константа, если ее поменять, затронет мне все документы, т.е. везде станет склад в ТЧ.

так что мне проще в процедуре Обработки чеков руками ее установить как мСкладыВТабличнойЧасти = ИСТИНА.

верно я думаю?
12. Shevon 1 09.06.16 11:23 Сейчас в теме
я так понимаю, что эта константа, если ее поменять, затронет мне все документы, т.е. везде станет склад в ТЧ.


Да. Но обязательным этот реквизит не является. При указании склада в шапке (например в "реализация товаров и услуг") и не указании в табличной части списываться будет со склада в шапке.
13. Shevon 1 09.06.16 11:36 Сейчас в теме
А вы бы не могли поделиться кодом процедуры ОбработкаЧековККМ


Простите за опоздание. Держите

	//Шевон
	//------------------------------------------------------------
	//Если КонецДня(Дата) = КонецДня(ТекущаяДата()) Тогда
	//	РежимПроведения = РежимПроведенияДокумента.Оперативный;
	//Иначе
	//	РежимПроведения = РежимПроведенияДокумента.Неоперативный;
	//КонецЕсли;
	//--------------------------------------------------------------
	РежимПроведения = РежимПроведенияДокумента.Неоперативный;
	//--------------------------------------------------------------
    //*Шевон
	
	МассивДокументовКПроведению = Новый Массив;

	ОтчетОРозничныхПродажах = СоздатьОтчетОРозничныхПродажах(Конец);
	СоответствиеТарифов = УправлениеРозничнойТорговлей.СформироватьСоответствиеТарифовЭквайринг(ОтчетОРозничныхПродажах.ДоговорЭквайринга);

	ОтчетОРозничныхПродажах.Склад = Справочники.Склады.ПустаяСсылка();

	ЗапросПоЧекам = Новый Запрос;
	//Шевон
	//---------------------------------------------------------
	//ЗапросПоЧекам.УстановитьПараметр("НачДата" , НачалоДня(Дата));
	//ЗапросПоЧекам.УстановитьПараметр("КонДата" , КонецДня(Дата));
	//---------------------------------------------------------
	ЗапросПоЧекам.УстановитьПараметр("НачДата" , Начало);
	ЗапросПоЧекам.УстановитьПараметр("КонДата" , Конец );
	//---------------------------------------------------------
	//*Шевон
	ЗапросПоЧекам.УстановитьПараметр("КассаККМ", КассаККМ);

	ЗапросПоЧекам.Текст ="
	|ВЫБРАТЬ
	|	Док.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ЧекККМ КАК Док
	|ГДЕ
	|	Док.Дата МЕЖДУ &НачДата И &КонДата
	|	И Док.КассаККМ = &КассаККМ
	|	И Док.Проведен
	|ДЛЯ ИЗМЕНЕНИЯ Документ.ЧекККМ
	|";

	Запрос = Новый Запрос;
	//Шевон
	//---------------------------------------------------------
	//Запрос.УстановитьПараметр("НачДата"           , НачалоДня(Дата));
	//Запрос.УстановитьПараметр("КонДата"           , КонецДня(Дата));
	Запрос.УстановитьПараметр("НачДата"           , Начало);
	Запрос.УстановитьПараметр("КонДата"           , Конец);
	//---------------------------------------------------------
	//*Шевон
	Запрос.УстановитьПараметр("КассаККМ"          , КассаККМ);
	Запрос.УстановитьПараметр("ВидОперацииПродажа", Перечисления.ВидыОперацийЧекККМ.Продажа);
	Запрос.Текст ="
	|ВЫБРАТЬ
	|	СУММА(	ВЫБОР	КОГДА ДокументЧекККМ.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЧекККМ.Продажа)
	|					ТОГДА 1
	|					ИНАЧЕ - 1
	|			КОНЕЦ)                                  КАК КоличествоСерийныхНоменров";
	//Шевон
	//---------------------------------------------------------
	//|	ДокументЧекККМ.Склад                            КАК Склад,
	//---------------------------------------------------------
	Запрос.Текст = Запрос.Текст + ?(мСкладыВТабличнойЧасти,",ЧекККМТовары.Склад  КАК Склад", ",ДокументЧекККМ.Склад  КАК Склад");
	Запрос.Текст = Запрос.Текст + ",
	//---------------------------------------------------------
	//*Шевон
	|	ЧекККМТовары.Номенклатура                        КАК Номенклатура,
	|	ЧекККМСерийныеНомера.СерийныйНомер               КАК СерийныйНомер,
	|	ЧекККМТовары.ХарактеристикаНоменклатуры          КАК ХарактеристикаНоменклатуры,
	|	ЧекККМТовары.СерияНоменклатуры                   КАК СерияНоменклатуры,
	|	ЧекККМТовары.ЕдиницаИзмерения                    КАК ЕдиницаИзмерения,
	|	ЧекККМТовары.Коэффициент                         КАК Коэффициент,
	|	ЧекККМТовары.Цена                                КАК Цена,
	|	ЧекККМТовары.ПроцентСкидкиНаценки                КАК ПроцентСкидкиНаценки,
	|	ЧекККМТовары.ПроцентАвтоматическихСкидок         КАК ПроцентАвтоматическихСкидок,
	|	ЧекККМТовары.УсловиеАвтоматическойСкидки         КАК УсловиеАвтоматическойСкидки,
	|	ЧекККМТовары.ЗначениеУсловияАвтоматическойСкидки КАК ЗначениеУсловияАвтоматическойСкидки
	|ИЗ
	|	Документ.ЧекККМ КАК ДокументЧекККМ
	|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	|	Документ.ЧекККМ.Товары КАК ЧекККМТовары
	|ПО
	|	ЧекККМТовары.Ссылка = ДокументЧекККМ.Ссылка
	|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	|	Справочник.Номенклатура КАК СправочникНоменклатура
	|ПО
	|	СправочникНоменклатура.Ссылка = ЧекККМТовары.Номенклатура
	|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	|	Документ.ЧекККМ.СерийныеНомера КАК ЧекККМСерийныеНомера
	|ПО
	|	ЧекККМСерийныеНомера.Ссылка = ДокументЧекККМ.Ссылка
	|	И ЧекККМСерийныеНомера.КлючСвязи = ЧекККМТовары.КлючСвязи
	|ГДЕ
	|	ДокументЧекККМ.Дата МЕЖДУ &НачДата И &КонДата
	|	И ДокументЧекККМ.Проведен
	|	И ДокументЧекККМ.КассаККМ = &КассаККМ
	|	И НЕ СправочникНоменклатура.Комплект
	|СГРУППИРОВАТЬ ПО";
	//Шевон
	//---------------------------------------------------------
	//|	ДокументЧекККМ.Склад                            КАК Склад,
	//---------------------------------------------------------
	Запрос.Текст = Запрос.Текст + ?(мСкладыВТабличнойЧасти," ЧекККМТовары.Склад", " ДокументЧекККМ.Склад");
	Запрос.Текст = Запрос.Текст + ",
	//---------------------------------------------------------
	//*Шевон
	|	ЧекККМТовары.Номенклатура,
	|	ЧекККМСерийныеНомера.СерийныйНомер,
	|	ЧекККМТовары.ХарактеристикаНоменклатуры,
	|	ЧекККМТовары.СерияНоменклатуры,
	|	ЧекККМТовары.ЕдиницаИзмерения,
	|	ЧекККМТовары.Коэффициент,
	|	ЧекККМТовары.Цена,
	|	ЧекККМТовары.ПроцентСкидкиНаценки,
	|	ЧекККМТовары.ПроцентАвтоматическихСкидок,
	|	ЧекККМТовары.УсловиеАвтоматическойСкидки,
	|	ЧекККМТовары.ЗначениеУсловияАвтоматическойСкидки
	|ИМЕЮЩИЕ
	|		СУММА(	ВЫБОР	КОГДА ДокументЧекККМ.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЧекККМ.Продажа)
	|					ТОГДА 1
	|					ИНАЧЕ - 1
	|			КОНЕЦ) > 0
	|;
	|ВЫБРАТЬ
	|	ЗНАЧЕНИЕ(Документ.ЧекККМ.ПустаяСсылка)   КАК Документ,
	|	Комплект                                 КАК Комплект,
	|	Склад                                    КАК Склад,
	|	ПодакцизныеТоварыДляКоммерческогоИспользования КАК ПодакцизныеТоварыДляКоммерческогоИспользования,
	|	Номенклатура                             КАК Номенклатура,
	|	Количество                               КАК Количество,
	|	ХарактеристикаНоменклатуры               КАК ХарактеристикаНоменклатуры,
	|	СерияНоменклатуры                        КАК СерияНоменклатуры,
	|	ЕдиницаИзмерения                         КАК ЕдиницаИзмерения,
	|	Коэффициент                              КАК Коэффициент,
	|	Цена                                     КАК Цена,
	|	ПроцентСкидкиНаценки                     КАК ПроцентСкидкиНаценки,
	|	ПроцентАвтоматическихСкидок              КАК ПроцентАвтоматическихСкидок,
	|	УсловиеАвтоматическойСкидки              КАК УсловиеАвтоматическойСкидки,
	|	ЗначениеУсловияАвтоматическойСкидки      КАК ЗначениеУсловияАвтоматическойСкидки,
	|	Сумма                                    КАК Сумма,
	|	ПУСТАЯТАБЛИЦА.(КлючСтроки, КлючСвязи, Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, ЕдиницаИзмерения, Количество, Цена) КАК СоставНабора,
	|	ПУСТАЯТАБЛИЦА.(КлючСвязи, СерийныйНомер) КАК СерийныеНомераСоставНабора,
	|	0 КАК КлючСтроки
	|ИЗ
	|(
	|ВЫБРАТЬ
	|	Док.Номенклатура.Комплект               КАК Комплект,
	|	Док.Ссылка.ПодакцизныеТоварыДляКоммерческогоИспользования КАК ПодакцизныеТоварыДляКоммерческогоИспользования";
	//Шевон
	//---------------------------------------------------------
	//|	Док.Ссылка.Склад                        КАК Склад,
	//---------------------------------------------------------
	Запрос.Текст = Запрос.Текст + ?(мСкладыВТабличнойЧасти,",Док.Склад КАК Склад", ",Док.Ссылка.Склад КАК Склад");
	Запрос.Текст = Запрос.Текст + ",
	//---------------------------------------------------------
	//*Шевон
	|	Док.Номенклатура                        КАК Номенклатура,
	|	СУММА(ВЫБОР
	|			КОГДА Док.Ссылка.ВидОперации = &ВидОперацииПродажа
	|				ТОГДА Док.Количество
	|			ИНАЧЕ -Док.Количество
	|		КОНЕЦ)                              КАК Количество,
	|	Док.ХарактеристикаНоменклатуры          КАК ХарактеристикаНоменклатуры,
	|	Док.СерияНоменклатуры                   КАК СерияНоменклатуры,
	|	Док.ЕдиницаИзмерения                    КАК ЕдиницаИзмерения,
	|	Док.Коэффициент                         КАК Коэффициент,
	|	Док.Цена                                КАК Цена,
	|	Док.ПроцентСкидкиНаценки                КАК ПроцентСкидкиНаценки,
	|	Док.ПроцентАвтоматическихСкидок         КАК ПроцентАвтоматическихСкидок,
	|	Док.УсловиеАвтоматическойСкидки         КАК УсловиеАвтоматическойСкидки,
	|	Док.ЗначениеУсловияАвтоматическойСкидки КАК ЗначениеУсловияАвтоматическойСкидки,
	|	СУММА(ВЫБОР
	|			КОГДА Док.Ссылка.ВидОперации = &ВидОперацииПродажа
	|				ТОГДА Док.Сумма
	|			ИНАЧЕ -Док.Сумма
	|		КОНЕЦ)                              КАК Сумма
	|ИЗ
	|	Документ.ЧекККМ.Товары КАК Док
	|ГДЕ
	|	Док.Ссылка.Дата МЕЖДУ &НачДата И &КонДата
	|	И Док.Ссылка.КассаККМ = &КассаККМ
	|	И Док.Ссылка.Проведен
	|	И НЕ Док.Номенклатура.Комплект
	|СГРУППИРОВАТЬ ПО
	|	Док.Ссылка.ПодакцизныеТоварыДляКоммерческогоИспользования";
	//Шевон
	//---------------------------------------------------------
	//|	Док.Ссылка.Склад                        КАК Склад,
	//---------------------------------------------------------
	Запрос.Текст = Запрос.Текст + ?(мСкладыВТабличнойЧасти,",Док.Склад", ",Док.Ссылка.Склад");
	Запрос.Текст = Запрос.Текст + ",
	//---------------------------------------------------------
	//*Шевон
	|	Док.Номенклатура,
	|	Док.ХарактеристикаНоменклатуры,
	|	Док.СерияНоменклатуры,
	|	Док.ЕдиницаИзмерения,
	|	Док.Коэффициент,
	|	Док.Цена,
	|	Док.ПроцентСкидкиНаценки,
	|	Док.ПроцентАвтоматическихСкидок,
	|	Док.УсловиеАвтоматическойСкидки,
	|	Док.ЗначениеУсловияАвтоматическойСкидки
	|ИМЕЮЩИЕ
	|	СУММА(ВЫБОР
	|			КОГДА Док.Ссылка.ВидОперации = &ВидОперацииПродажа
	|				ТОГДА Док.Количество
	|			ИНАЧЕ -Док.Количество
	|		КОНЕЦ) <> 0) КАК ТоварыБезКомплектов
	|ОБЪЕДИНИТЬ ВСЕ
	|ВЫБРАТЬ
	|	Док.Ссылка                              КАК Документ,
	|	Док.Номенклатура.Комплект               КАК Комплект,
	|	Док.Ссылка.ПодакцизныеТоварыДляКоммерческогоИспользования КАК ПодакцизныеТоварыДляКоммерческогоИспользования";
	//Шевон
	//---------------------------------------------------------
	//|	Док.Ссылка.Склад                        КАК Склад,
	//---------------------------------------------------------
	Запрос.Текст = Запрос.Текст + ?(мСкладыВТабличнойЧасти,",Док.Склад КАК Склад", ",Док.Ссылка.Склад КАК Склад");
	Запрос.Текст = Запрос.Текст + ",
	//---------------------------------------------------------
	//*Шевон
	|	Док.Номенклатура                        КАК Номенклатура,
	|	ВЫБОР
	|			КОГДА Док.Ссылка.ВидОперации = &ВидОперацииПродажа
	|				ТОГДА Док.Количество
	|			ИНАЧЕ -Док.Количество
	|		КОНЕЦ                               КАК Количество,
	|	Док.ХарактеристикаНоменклатуры          КАК ХарактеристикаНоменклатуры,
	|	Док.СерияНоменклатуры                   КАК СерияНоменклатуры,
	|	Док.ЕдиницаИзмерения                    КАК ЕдиницаИзмерения,
	|	Док.Коэффициент                         КАК Коэффициент,
	|	Док.Цена                                КАК Цена,
	|	Док.ПроцентСкидкиНаценки                КАК ПроцентСкидкиНаценки,
	|	Док.ПроцентАвтоматическихСкидок         КАК ПроцентАвтоматическихСкидок,
	|	Док.УсловиеАвтоматическойСкидки         КАК УсловиеАвтоматическойСкидки,
	|	Док.ЗначениеУсловияАвтоматическойСкидки КАК ЗначениеУсловияАвтоматическойСкидки,
	|	ВЫБОР
	|			КОГДА Док.Ссылка.ВидОперации = &ВидОперацииПродажа
	|				ТОГДА Док.Сумма
	|			ИНАЧЕ -Док.Сумма
	|		КОНЕЦ                               КАК Сумма,
	|	Док.Ссылка.СоставНабора.(КлючСтроки, КлючСвязи, Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, ЕдиницаИзмерения, Количество, Цена) КАК СоставНабора,
	|	Док.Ссылка.СерийныеНомераСоставНабора.(КлючСвязи, СерийныйНомер) КАК СерийныеНомераСоставНабора,
	|	Док.КлючСтроки
	|ИЗ
	|	Документ.ЧекККМ.Товары КАК Док
	|ГДЕ
	|	Док.Ссылка.Дата МЕЖДУ &НачДата И &КонДата
	|	И Док.Ссылка.КассаККМ = &КассаККМ
	|	И Док.Ссылка.Проведен
	|	И Док.Номенклатура.Комплект
	|	УПОРЯДОЧИТЬ ПО Склад
	|";

	ЗапросПоОплате = Новый Запрос("
	|ВЫБРАТЬ
	|	Док.Ссылка.Склад КАК Склад,
	|	Док.ВидОплаты.ТипОплаты КАК ТипОплаты,
	|	Док.ВидОплаты КАК ВидОплаты,
	|	СУММА(ВЫБОР КОГДА Док.Ссылка.ВидОперации = &ВидОперацииПродажа ТОГДА
	|		Док.Сумма
	|	ИНАЧЕ
	|		-Док.Сумма
	|	КОНЕЦ) КАК Сумма
	|ИЗ
	|	Документ.ЧекККМ.Оплата КАК Док
	|ГДЕ
	|	Док.Ссылка.Дата МЕЖДУ &НачДата И &КонДата
	|	И Док.Ссылка.КассаККМ = &КассаККМ
	|	И Док.Ссылка.Проведен
	|	И Док.ВидОплаты.ТипОплаты <> &ТипОплатыНаличные
	|СГРУППИРОВАТЬ ПО
	|	Док.Ссылка.Склад,
	|	Док.Ссылка,
	|	Док.НомерСтроки,
	|	Док.ВидОплаты.ТипОплаты,
	|	Док.ВидОплаты
	|");

	//Шевон
	//---------------------------------------------------------
	//ЗапросПоОплате.УстановитьПараметр("НачДата"           , НачалоДня(Дата));
	//ЗапросПоОплате.УстановитьПараметр("КонДата"           , КонецДня(Дата));
	//---------------------------------------------------------
	ЗапросПоОплате.УстановитьПараметр("НачДата"           , Начало);
	ЗапросПоОплате.УстановитьПараметр("КонДата"           , Конец);
	//---------------------------------------------------------
    //*Шевон
	ЗапросПоОплате.УстановитьПараметр("КассаККМ"          , КассаККМ);
	ЗапросПоОплате.УстановитьПараметр("ВидОперацииПродажа", Перечисления.ВидыОперацийЧекККМ.Продажа);
	ЗапросПоОплате.УстановитьПараметр("ТипОплатыНаличные" , Перечисления.ТипыОплатЧекаККМ.Наличные);

	ЗапросПоДисконтнымКартам = Новый Запрос("
	|ВЫБРАТЬ
	|	Док.Склад КАК Склад,
	|	Док.ДисконтнаяКарта КАК ДисконтнаяКарта,
	|	Док.ВладелецДисконтнойКарты КАК ВладелецДисконтнойКарты,
	|	СУММА(ВЫБОР КОГДА Док.ВидОперации = &ВидОперацииПродажа ТОГДА
	|		Док.СуммаДокумента
	|	ИНАЧЕ
	|		-Док.СуммаДокумента
	|	КОНЕЦ) КАК Сумма
	|ИЗ
	|	Документ.ЧекККМ КАК Док
	|ГДЕ
	|	Док.Дата МЕЖДУ &НачДата И &КонДата
	|	И Док.КассаККМ = &КассаККМ
	|	И Док.ДисконтнаяКарта <> &ПустаяДисконтнаяКарта
	|	И Док.Проведен
	|СГРУППИРОВАТЬ ПО
	|	Док.Склад,
	|	Док.ДисконтнаяКарта,
	|	Док.ВладелецДисконтнойКарты
	|ИМЕЮЩИЕ
	|	СУММА(ВЫБОР КОГДА Док.ВидОперации = &ВидОперацииПродажа ТОГДА
	|		Док.СуммаДокумента
	|	ИНАЧЕ
	|		-Док.СуммаДокумента
	|	КОНЕЦ) <> 0
	|");

	//Шевон
	//---------------------------------------------------------
	//ЗапросПоДисконтнымКартам.УстановитьПараметр("НачДата"              , НачалоДня(Дата));
	//ЗапросПоДисконтнымКартам.УстановитьПараметр("КонДата"              , КонецДня(Дата));
	//---------------------------------------------------------
	ЗапросПоДисконтнымКартам.УстановитьПараметр("НачДата"              , Начало);
	ЗапросПоДисконтнымКартам.УстановитьПараметр("КонДата"              , Конец);
	//---------------------------------------------------------
    //*Шевон
	ЗапросПоДисконтнымКартам.УстановитьПараметр("КассаККМ"             , КассаККМ);
	ЗапросПоДисконтнымКартам.УстановитьПараметр("ПустаяДисконтнаяКарта", Справочники.ИнформационныеКарты.ПустаяСсылка());
	ЗапросПоДисконтнымКартам.УстановитьПараметр("ВидОперацииПродажа"   , Перечисления.ВидыОперацийЧекККМ.Продажа);
	ЗапросПоДисконтнымКартам.УстановитьПараметр("ТипОплатыНаличные"    , Перечисления.ТипыОплатЧекаККМ.Наличные);

	//-Перенесено Шевон
	//ОтменитьТранзакцию = Ложь;
	//НачатьТранзакцию();
	//*-Перенесено Шевон

	РезультатЗапросаПоЧекам = ЗапросПоЧекам.Выполнить();
	РезультатыЗапросов = Запрос.ВыполнитьПакет();
	РезультатЗапроса = РезультатыЗапросов[1];
	//РезультатыЗапросов массив из двух элементов
	//РезультатЗапроса[0] - все серийные номера на номенклатуру
	//РезультатЗапроса[1] - Основной запрос
	РезультатЗапросаПоОплате = ЗапросПоОплате.Выполнить();
	ТаблицаПоДисконтнымКартам = ЗапросПоДисконтнымКартам.Выполнить().Выгрузить();
	ТаблицаПоДисконтнымКартам.Индексы.Добавить("Склад");
	ТаблицаСерийныеНомераНоменклатуры = РезультатыЗапросов[0].Выгрузить();

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

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

	ТаблицаСерийныеНомераКомплект              = Неопределено;     // Таблица в которую будут выгружены серийные номера на комплектующие набора-комплекта
	СтруктураПоискаСерийногоНомера             = Новый Структура();// Набор полей для поиска серийного номера на комплектующее набора-комплекта
	СтруктураПоискаСерийногоНомераНоменклатура = Новый Структура();// Набор полей для поиска серийного номера на номенклатуру
	СтруктураПоляЗаполнения                    = Новый Структура();// Содержит поля которые нужно обновить в документе "Отчет о розничных продажах"
	//СтруктураПоляЗаполнения содержит поля которые нужно обновить.
	//Ключ структуры содержит имя поля
	//Значение структуры = "Истина" поле участвует в отборе по таблице с серийными номерами
	//                   = "Ложь" поле не участвует в отборе по таблице с серийными номерами
	СтруктураПоляЗаполнения.Вставить("Склад"                              , Истина);
	СтруктураПоляЗаполнения.Вставить("Номенклатура"                       , Истина);
	СтруктураПоляЗаполнения.Вставить("ЕдиницаИзмерения"                   , Истина);
	СтруктураПоляЗаполнения.Вставить("Коэффициент"                        , Истина);
	СтруктураПоляЗаполнения.Вставить("ХарактеристикаНоменклатуры"         , Истина);
	СтруктураПоляЗаполнения.Вставить("СерияНоменклатуры"                  , Истина);
	СтруктураПоляЗаполнения.Вставить("Количество"                         , Ложь);
	СтруктураПоляЗаполнения.Вставить("Цена"                               , Истина);
	СтруктураПоляЗаполнения.Вставить("ПроцентСкидкиНаценки"               , Истина);
	СтруктураПоляЗаполнения.Вставить("ПроцентАвтоматическихСкидок"        , Истина);
	СтруктураПоляЗаполнения.Вставить("УсловиеАвтоматическойСкидки"        , Истина);
	СтруктураПоляЗаполнения.Вставить("ЗначениеУсловияАвтоматическойСкидки", Истина);
	СтруктураПоляЗаполнения.Вставить("Сумма"                              , Ложь);
	СтруктураПоляЗаполнения.Вставить("ПодакцизныеТоварыДляКоммерческогоИспользования", Ложь);
	СтрокаПолейИндекса = "";
	Для Каждого ИмяПоля Из СтруктураПоляЗаполнения Цикл
		Если ИмяПоля.Значение Тогда
			СтрокаПолейИндекса = СтрокаПолейИндекса + ИмяПоля.Ключ + ",";
		КонецЕсли;
	КонецЦикла;
	ТаблицаСерийныеНомераНоменклатуры.Индексы.Добавить(Сред(СтрокаПолейИндекса, 0,СтрДлина(СтрокаПолейИндекса) - 1));

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

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

							МассивОплат = ТаблицаОплатПлатежныеКарты.НайтиСтроки(СтруктураПоиска);
							Для Каждого Оплата Из МассивОплат Цикл
								НоваяСтрока = ОтчетОРозничныхПродажах.ОплатаПлатежнымиКартами.Добавить();
								НоваяСтрока.ВидОплаты = Оплата.ВидОплаты;
								НоваяСтрока.Сумма = Оплата.Сумма;
								НоваяСтрока.ПроцентТорговойУступки = СоответствиеТарифов[НоваяСтрока.ВидОплаты];
								ОтчетОРозничныхПродажах.ПересчитатьТорговуюУступку(НоваяСтрока);

								ТаблицаОплатПлатежныеКарты.Удалить(Оплата);
							КонецЦикла;

							МассивОплат = ТаблицаОплатБанковскиеКредиты.НайтиСтроки(СтруктураПоиска);
							Для Каждого Оплата Из МассивОплат Цикл
								НоваяСтрока = ОтчетОРозничныхПродажах.ОплатаБанковскимиКредитами.Добавить();
								НоваяСтрока.ВидОплаты = Оплата.ВидОплаты;
								НоваяСтрока.Сумма = Оплата.Сумма;
								ОтчетОРозничныхПродажах.ПриИзмененииВидаОплатыБанковскимКредитом(НоваяСтрока);

								ТаблицаОплатБанковскиеКредиты.Удалить(Оплата);
							КонецЦикла;

							МассивДисконтныхКарт = ТаблицаПоДисконтнымКартам.НайтиСтроки(СтруктураПоиска);
							Для Каждого ПродажаПоДисконтнойКарте Из МассивДисконтныхКарт Цикл
								НоваяСтрока = ОтчетОРозничныхПродажах.ПродажиПоДисконтнымКартам.Добавить();
								НоваяСтрока.ДисконтнаяКарта = ПродажаПоДисконтнойКарте.ДисконтнаяКарта;
								НоваяСтрока.ВладелецДисконтнойКарты = ПродажаПоДисконтнойКарте.ВладелецДисконтнойКарты;
								НоваяСтрока.Сумма = ПродажаПоДисконтнойКарте.Сумма;

								ТаблицаПоДисконтнымКартам.Удалить(ПродажаПоДисконтнойКарте);
							КонецЦикла;

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

						ОтчетОРозничныхПродажах = СоздатьОтчетОРозничныхПродажах(Конец);
						СоответствиеТарифов = УправлениеРозничнойТорговлей.СформироватьСоответствиеТарифовЭквайринг(ОтчетОРозничныхПродажах.ДоговорЭквайринга);

						ОтчетОРозничныхПродажах.Склад = Выборка.Склад;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;

			СтрокаТабличнойЧасти = ОтчетОРозничныхПродажах.Товары.Добавить();

			Если Выборка.Комплект Тогда
				СтрокаТабличнойЧасти.КлючСтроки = УправлениеЗапасами.ПолучитьНовыйКлючСтроки(ОтчетОРозничныхПродажах);
				ЗаполнитьЗначенияСвойств(СтрокаТабличнойЧасти, Выборка,
				"Номенклатура, ЕдиницаИзмерения, Коэффициент, ХарактеристикаНоменклатуры, СерияНоменклатуры, Количество, Цена, ПроцентСкидкиНаценки, ПроцентАвтоматическихСкидок, УсловиеАвтоматическойСкидки, ЗначениеУсловияАвтоматическойСкидки, Сумма, ПодакцизныеТоварыДляКоммерческогоИспользования");
				
				ВыборкаКомплектующих = Выборка.СоставНабора.Выбрать();
				Пока ВыборкаКомплектующих.Следующий() Цикл
					Если ВыборкаКомплектующих.КлючСтроки = Выборка.КлючСтроки Тогда
						СтрокаСоставаНабора = ОтчетОРозничныхПродажах.СоставНабора.Добавить();
						ЗаполнитьЗначенияСвойств(СтрокаСоставаНабора, ВыборкаКомплектующих,
						"Номенклатура, ЕдиницаИзмерения, ХарактеристикаНоменклатуры, СерияНоменклатуры, Количество, Цена");
						СтрокаСоставаНабора.КлючСтроки = СтрокаТабличнойЧасти.КлючСтроки;
						Если НЕ ВыборкаКомплектующих.КлючСвязи = 0 Тогда
							СтруктураПоискаСерийногоНомера.Вставить("КлючСвязи", ВыборкаКомплектующих.КлючСвязи);
							массивСтрок = ТаблицаСерийныеНомераКомплект.НайтиСтроки(СтруктураПоискаСерийногоНомера);
							КлючСвязи = УчетСерийныхНомеров.ПолучитьНовыйКлючСвязи(ПараметрыСвязиСтрокТЧ, ОтчетОРозничныхПродажах, "СоставНабора", Истина);
							СтрокаСоставаНабора.КлючСвязи      = КлючСвязи;
							Для Каждого СтрокаСерийногоНомераЧекККМ Из массивСтрок Цикл
								СтрокаСерийногоНомера               = ОтчетОРозничныхПродажах.СерийныеНомераСоставНабора.Добавить();
								СтрокаСерийногоНомера.СерийныйНомер = СтрокаСерийногоНомераЧекККМ.СерийныйНомер;
								СтрокаСерийногоНомера.КлючСвязи     = КлючСвязи;
							КонецЦикла;
						КонецЕсли;
					КонецЕсли;
				КонецЦикла;
			Иначе
				Для Каждого ПолеЗаполнения Из СтруктураПоляЗаполнения Цикл
					СтрокаТабличнойЧасти[ПолеЗаполнения.Ключ] = Выборка[ПолеЗаполнения.Ключ];
					Если ПолеЗаполнения.Значение Тогда
						СтруктураПоискаСерийногоНомераНоменклатура.Вставить(ПолеЗаполнения.Ключ, Выборка[ПолеЗаполнения.Ключ]);
					КонецЕсли;
				КонецЦикла;
				массивСтрок = ТаблицаСерийныеНомераНоменклатуры.НайтиСтроки(СтруктураПоискаСерийногоНомераНоменклатура);
				Если массивСтрок.Количество() > 0 Тогда
					КлючСвязи = УчетСерийныхНомеров.ПолучитьНовыйКлючСвязи(ПараметрыСвязиСтрокТЧ, ОтчетОРозничныхПродажах, "Товары", Истина);
					СтрокаТабличнойЧасти.КлючСвязи      = КлючСвязи;
					Для Каждого СтрокаСерийногоНомераЧекККМ Из массивСтрок Цикл
						Для х = 1 По СтрокаСерийногоНомераЧекККМ.КоличествоСерийныхНоменров Цикл
							СтрокаСерийногоНомера               = ОтчетОРозничныхПродажах.СерийныеНомера.Добавить();
							СтрокаСерийногоНомера.СерийныйНомер = СтрокаСерийногоНомераЧекККМ.СерийныйНомер;
							СтрокаСерийногоНомера.КлючСвязи     = КлючСвязи;
						КонецЦикла;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;

			Если мСкладыВТабличнойЧасти Тогда
				СтрокаТабличнойЧасти.Склад = Выборка.Склад;
			КонецЕсли;
		КонецЦикла;

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

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

			Для Каждого Оплата Из ТаблицаОплатБанковскиеКредиты Цикл
				НоваяСтрока = ОтчетОРозничныхПродажах.ОплатаБанковскимиКредитами.Добавить();
				НоваяСтрока.ВидОплаты = Оплата.ВидОплаты;
				НоваяСтрока.Сумма = Оплата.Сумма;
				ОтчетОРозничныхПродажах.ПриИзмененииВидаОплатыБанковскимКредитом(НоваяСтрока);
			КонецЦикла;

			Для Каждого ПродажаПоДисконтнойКарте Из ТаблицаПоДисконтнымКартам Цикл
				НоваяСтрока = ОтчетОРозничныхПродажах.ПродажиПоДисконтнымКартам.Добавить();
				НоваяСтрока.ДисконтнаяКарта = ПродажаПоДисконтнойКарте.ДисконтнаяКарта;
				НоваяСтрока.ВладелецДисконтнойКарты = ПродажаПоДисконтнойКарте.ВладелецДисконтнойКарты;
				НоваяСтрока.Сумма = ПродажаПоДисконтнойКарте.Сумма;
			КонецЦикла;

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

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

КонецПроцедуры // ОбработкаЧековККМ()

Показать


Здесь кассовая смена по переоценкам разбивается

а еще и оплаты картами и прочее.


Оплаты они и придут в кассу ККМ, которую Вы закрываете. Здесь суть в том, с какого слада списываться будет.
14. AlexeyPapanov 460 10.06.16 09:10 Сейчас в теме
(13) Shevon, спасибо! я понял, чего Вы добивались в коде. А у меня попроще пока задача.
Мои вопросы были от незнания программы. Ведь если поставить в константах указания складов в ТЧ, то этим задача решена. Все чеки с разными складами сворачиваются в один отчет о розничных продажах, где в ТЧ склады будут указаны из чеков.

У вас я так понимаю более красивый вариант тем, что в ТЧ ЧекаККМ вы добавили склад, и можно в одном чеке выписать товар с разных складов. Но такое пока мне не нужно.
Скажите, а вы получается после добавления складов в чеке дописывали же движения по регистрам?
я имею ввиду, что чек ккм тоже двигает регистры в разрезе складов.
15. SGordon1 10.06.16 12:53 Сейчас в теме
чек сам со всем справляется....
16. SGordon1 10.06.16 12:54 Сейчас в теме
блин, соврал у нас стандартный вариант ...
17. Shevon 1 11.06.16 12:49 Сейчас в теме
Скажите, а вы получается после добавления складов в чеке дописывали же движения по регистрам?
я имею ввиду, что чек ккм тоже двигает регистры в разрезе складов.

Да. движения дорабатывал.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот