Версия для печати темы (https://pro1c.org.ua/index.php?s=142719cf2dcbb04433fb85f5dc14505f&showtopic=66968)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Програмне розбиття чеку на 2-ва окремих робочому місці касира!

Автор: 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 * ,
При записі чеку з акцизними товарами.

  Результат = ЗаписатьНаСервере(Истина);

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua