Автор: Pashaboston 09.05.22, 13:46
Доброго дня, конфігурація BAS Управління торгівлею. Стоїть завдання, якщо у чеку є акцизні і звичайні товари, то розділяти чек на 2 чеки.
Було вибрано наступний варіант, перед тим як чек проводиться, програмно перевіряти на наявність акцизу і програмне створеня 2-х чеків(спочатку пробивається і друкується звичайний чек з всіма товарами, а тоді окремо друкується фіскальний чек з акцизними товарами ). Чек без акцизних товарів створюється і троводиться програмно програмно, а акцизні товари завантажуються в документ об'єкт відкритого документу і він також має пробитися.
Код&НаКлиенте
Процедура ПробитьЧек()
ОчиститьСообщения();
ЕстьОшибки = Ложь;
Если Объект.ПометкаУдаления Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Документ помечен на удаление';uk='Документ позначений на вилучення'"), Объект.Ссылка,,,ЕстьОшибки);
КонецЕсли;
Объект.Дата = ТекущаяДата();
Модифицированность = Истина;
Если ЕстьОшибки Или Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ПробитьЧекПослеПроведения", ЭтотОбъект),
НСтр("ru='Перед выполнением операции пробития чека не удалось провести документ.';uk='Перед виконанням операції пробиття чека не вдалося провести документ.'"));
//++++++++++++++++++++++++++++++++++++++++++++
Если ПроверкаСтатуса (ЭтотОбъект.Объект.Статус) Тогда
ЕстьАкциз = Ложь;
СтруктураДопКаси(,,ЭтотОбъект.Объект);
Если ЕстьАкциз Тогда
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ПробитьЧекПослеПроведения", ЭтотОбъект),
НСтр("ru='Перед выполнением операции пробития чека не удалось провести документ.';uk='Перед виконанням операції пробиття чека не вдалося провести документ.'"));
КонецЕсли;
КонецЕсли;
//++++++++++++++++++++++++++++++++++++++++++++
КонецПроцедуры
&НаСервере
Процедура СтруктураДопКаси (ЕстьАкциз = Ложь,ДопКаса = Неопределено,ЭтотОбъект)
ДопКаса = ПолучитьДопКасу(ДопКаса);
Структура = ПроверкаНаАкциз(ЭтотОбъект,ЕстьАкциз,ДопКаса);
Если ЕстьАкциз Тогда
ДокументОбъект = ЭтотОбъект.Ссылка.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
ДокументОбъект.Товары.Загрузить(Структура.ТзАкцизных);
ДокументОбъект.КассаККМ = ДопКаса;
ДокументОбъект.Организация = ДопКаса.Владелец;
ДокументОбъект.СуммаДокумента = ДокументОбъект.товары.Итог("Сумма");
ДокументОбъект.Статус = Перечисления.СтатусыЧековККМ.Пробит;
ЗначениеВДанныеФормы(ДокументОбъект, Объект);
Результат = ЗаписатьНаСервере(Истина);
КонецЕсли;
//Попытка
// ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
//Исключение
//КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПроверкаНаАкциз(ДокументОбъект, ЕстьАкциз,ДопКасса) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЧекККМТовары.Ссылка,
| ЧекККМТовары.НомерСтроки,
| ЧекККМТовары.КлючСвязи,
| ЧекККМТовары.Номенклатура,
| ЧекККМТовары.Характеристика,
| ЧекККМТовары.Упаковка,
| ЧекККМТовары.КоличествоУпаковок,
| ЧекККМТовары.Количество,
| ЧекККМТовары.Цена,
| ЧекККМТовары.Сумма,
| ЧекККМТовары.СтавкаНДС,
| ЧекККМТовары.СуммаНДС,
| ЧекККМТовары.ПроцентАвтоматическойСкидки,
| ЧекККМТовары.СуммаАвтоматическойСкидки,
| ЧекККМТовары.ПроцентРучнойСкидки,
| ЧекККМТовары.СуммаРучнойСкидки,
| ЧекККМТовары.СтатусУказанияСерий,
| ЧекККМТовары.Продавец,
| ЧекККМТовары.Помещение,
| ЧекККМТовары.Серия,
| ЧекККМТовары.СуммаБонусныхБалловКСписанию,
| ЧекККМТовары.СуммаБонусныхБалловКСписаниюВВалюте,
| ЧекККМТовары.СуммаНачисленныхБонусныхБалловВВалюте,
| ЧекККМТовары.НоменклатураНабора,
| ЧекККМТовары.ХарактеристикаНабора,
| ЧекККМТовары.Штрихкод,
| ЧекККМТовары.ИдентификаторСтроки
|ИЗ
| Документ.ЧекККМ.Товары КАК ЧекККМТовары
|ГДЕ
| ЧекККМТовары.Номенклатура.ПодакцизныйТовар = ЛОЖЬ
| И ЧекККМТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДокументОбъект.Ссылка);
ТзБезАкцизных = Запрос.Выполнить().Выгрузить();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЧекККМТовары.Ссылка,
| ЧекККМТовары.НомерСтроки,
| ЧекККМТовары.КлючСвязи,
| ЧекККМТовары.Номенклатура,
| ЧекККМТовары.Характеристика,
| ЧекККМТовары.Упаковка,
| ЧекККМТовары.КоличествоУпаковок,
| ЧекККМТовары.Количество,
| ЧекККМТовары.Цена,
| ЧекККМТовары.Сумма,
| ЧекККМТовары.СтавкаНДС,
| ЧекККМТовары.СуммаНДС,
| ЧекККМТовары.ПроцентАвтоматическойСкидки,
| ЧекККМТовары.СуммаАвтоматическойСкидки,
| ЧекККМТовары.ПроцентРучнойСкидки,
| ЧекККМТовары.СуммаРучнойСкидки,
| ЧекККМТовары.СтатусУказанияСерий,
| ЧекККМТовары.Продавец,
| ЧекККМТовары.Помещение,
| ЧекККМТовары.Серия,
| ЧекККМТовары.СуммаБонусныхБалловКСписанию,
| ЧекККМТовары.СуммаБонусныхБалловКСписаниюВВалюте,
| ЧекККМТовары.СуммаНачисленныхБонусныхБалловВВалюте,
| ЧекККМТовары.НоменклатураНабора,
| ЧекККМТовары.ХарактеристикаНабора,
| ЧекККМТовары.Штрихкод,
| ЧекККМТовары.ИдентификаторСтроки
|ИЗ
| Документ.ЧекККМ.Товары КАК ЧекККМТовары
|ГДЕ
| ЧекККМТовары.Номенклатура.ПодакцизныйТовар = Истина
| И ЧекККМТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДокументОбъект.Ссылка);
ТзАкцизных = Запрос.Выполнить().Выгрузить();
Если ТзАкцизных.Количество() = 0 Тогда
ЕстьАкциз = Ложь;
Возврат ЕстьАкциз = Ложь;
Иначе
Если ТзБезАкцизных.Количество() <> 0 Тогда
НовыйДок = ДокументОбъект.Ссылка.Скопировать();
НовыйДок.товары.Загрузить(ТзБезАкцизных);
НовыйДок.Дата = ДокументОбъект.Дата;
НовыйДок.СуммаДокумента = НовыйДок.товары.Итог("Сумма");
НовыйДок.Статус = Перечисления.СтатусыЧековККМ.Пробит;
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
ЕстьАкциз = Истина;
КонецЕсли;
Структура = Новый структура;
Структура.Вставить("ТзБезАкцизных",ТзБезАкцизных);
Структура.Вставить("ТзАкцизных",ТзАкцизных);
Структура.Вставить("ДопКасса",ДопКасса);
Структура.Вставить("ЕстьАкциз",ЕстьАкциз);
Возврат Структура;
КонецФункции
Після цього з'являється помилка "неможливо змінювати поле яке містить об'єкт даних форми"!!!
В чрму може бути причина, або порадьте інший варіант вирішення завдання(цей варіант працював в звичайних формах...).
Автор: Vofka 09.05.22, 16:01
В якому саме рядку виникає помилка?
Автор: Pashaboston 09.05.22, 16:26
Vofka @ Сегодня, 16:01
,
При записі чеку з акцизними товарами.
Результат = ЗаписатьНаСервере(Истина);