8.х Создание ОперацииБух

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем ZEMA, 25 окт 2010.

  1. TopicStarter Overlay
    ZEMA
    Offline

    ZEMA Опытный в 1С

    Регистрация:
    5 окт 2007
    Сообщения:
    231
    Симпатии:
    0
    Баллы:
    26
    Всем привет. Необходимо создать переоценку товара (операцией, для отображения в бух), но что-то у меня не выходит, могли бы подсказать где ошибка? Вот код программы:
    Код:
    НомерДокаВАптеке = Номер;
    ДатаВремя = Датад;
    
    //Возможные ошибки
    //*****
    //Формат строки с датой
    Попытка ДатаДока = Дата(ДатаВремя)
    Исключение
    Сообщить("Ошибка в формате даты документа переоценка товаров " + НомерДокаВАптеке + ". Строка в файле № " + н);
    Сообщить("!!!Документ не будет создан в программе. Требуется повторная загрузка.");
    Возврат;
    КонецПопытки;
    
    //Пустой номер
    Если НомерДокаВАптеке = "" Тогда
    Сообщить("В строке выгрузки " + н + " пустой номер документа переоценка товара");
    Сообщить("!!!Документ не будет создан в программе. Требуется повторная загрузка.");
    Возврат;
    КонецЕсли;
    
    //Вместо суммы что-то другое
    ЦенаДокС = 0;
    Попытка
    ЦенаДокС = Ценас;
    Исключение
    Если ЦенаДокС = "" Тогда
    ЦенаДокС = 0;
    Иначе
    Сообщить("В строке " + н + "некорректное значение суммы " + ЦенаДокС);
    Сообщить("!!!Документ переоценка товара не будет создан в программе. Требуется повторная загрузка.");
    Возврат;
    КонецЕсли;
    КонецПопытки;
    
    ЦенаДокН = 0;
    Попытка 
    ЦенаДокН = ЦенаН;
    Исключение              
    Если ЦенаДОКН= "" Тогда
    ЦенаДокН = 0;
    Иначе
    Сообщить("В строке " + н + "некорректное значение суммы " );
    Сообщить("!!!Документ переоценка товара не будет создан в программе. Требуется повторная загрузка.");
    Возврат;
    КонецЕсли;
    КонецПопытки;
    
    
    
    //Ищем или создаем складотправитель
    Склад = Справочники.Склады.ПустаяСсылка();
    ПоискСклада(Склад, СокрЛП(Слова.Получить(4).Значение), СокрЛП(Слова.Получить(5).Значение)); 
    
    //Ищем или создаем документ возврат товаров поставщику
    //уникально номер + склад
    ДокНайден = 0;
    ДокВыборка = Документы.ОперацияБух.Выбрать(ДатаДока-2*60*60*24,ДатаДока+2*60*60*24-1);
    Пока ДокВыборка.Следующий() Цикл
    Если Найти(ДокВыборка.Комментарий,НомерДокаВАптеке + "_" + СокрЛП(Склад.Код)) Тогда
    Док = ДокВыборка.ПолучитьОбъект();
    ДокНайден = 1;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    НачатьТранзакцию();
    
    Если ДокНайден = 1 Тогда
    Сообщить("Найден документ! "+Док+"("+НомерДокаВАптеке+")"+" документ будет изменен!!!");
    Если Док.Проведен Тогда
    Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
    КонецЕсли;
    Если Док.ПометкаУдаления Тогда
    Сообщить("Документ " + Док +"("+НомерДокаВАптеке+")"+ " был помечен на удаление!!!");
    Док.УстановитьПометкуУдаления(Ложь);
    КонецЕсли;
    Иначе
    Док=Документы.ОперацияБух.СоздатьДокумент();
    КонецЕсли;
    
    //заполняем шапку
    Док.Дата          = датаДока;    
    Док.Организация   = Справочники.Организации.НайтиПоКоду("000000000001").Ссылка;
    Док.Комментарий   = НомерДокаВАптеке + "_" + СокрЛП(Склад.Код);
    //Док.ВидОперации   = Перечисления.ВидыОперацийПереоценкаТоваровВРознице.ПереоценкаВРознице;
    //Док.Склад         = Склад;
    Док.Ответственный = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойОтветственный");
    ПроводкиБУ = Док.Движения.Хозрасчетный;
    
    // заполняем табличную часть
    Если  ЦенаДокН-ЦенаДокС <> 0 Тогда
    Проводка = ПроводкиБУ.Добавить();     
    
    Проводка.Содержание  = "";                                                                               
    Проводка.Период      = Док.Дата;
    Проводка.Организация = Док.Организация;
    Проводка.СчетДт      = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.02");
    Проводка.СчетКт      = ПланыСчетов.Хозрасчетный.НайтиПоКоду("42");
    Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады]                            = Склад;
    Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура]                      = Справочники.Номенклатура.НайтиПоКоду("00000001674").Ссылка;
    Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("Переоценка")] = Справочники.Субконто.НайтиПоКоду("000000001");
    Проводка.Сумма       = ЦенаДокН-ЦенаДокС;
    Если Проводка.Сумма<0 Тогда
    Проводка.КоличествоДт=-Проводка.Сумма;
    КонецЕсли;    
    // пересчитаем сумму документа
    Док.СуммаОперации = 0;
    Для каждого Проводка Из Док.Движения.Хозрасчетный Цикл
    Док.СуммаОперации = Док.СуммаОперации + Проводка.Сумма;
    КонецЦикла;
    
    КонецЕсли; 
    
    Попытка    Док.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Переоценка товара" + НомерДокаВАптеке + " записан и проведен!");
    ЗафиксироватьТранзакцию();
    Исключение
    //Если не провел, то пусть запишет
    Попытка Док.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Переоценка товара" + НомерДокаВАптеке + " Записан!");    
    Исключение
    Сообщить("Переоценка товара" + НомерДокаВАптеке + " не записан!!!");
    Сообщить(ИнформацияОбОшибке());
    Сообщить("!!! Требуется повторная загрузка.");
    КонецПопытки;
    Сообщить("Переоценка товара" + НомерДокаВАптеке + " не проведен!");
    ОтменитьТранзакцию();
    Возврат;
    КонецПопытки;
    
    
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Бррр... че-то перемутили вы с транзакциями. Я не разбирался там как сделать проводку (вы скажите то что не работает), но сам код - ужас. "Попытка" - переносите наверх (до начала транзакции). В обработчике исключения убирайте попытку записи (оно и не запишется скорее всего, ибо стоит ОтменаТранзакции()). Умерла так умерла: вышло исключение - сообщили причину, откатили транзакцию и все, не надо там что-то пытаться делать, система должна тупо вернутся в состояние в котором была до начала транзакции.
  3. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.566
    Симпатии:
    717
    Баллы:
    204
    операциябух - это, грубо говоря, ссылка на НаборЗаписей регистра бухгалтерии.

    Движения записывать нужно напрямую в НаборЗаписей с отбором по регистратору "ОперацияБух"
  4. TopicStarter Overlay
    ZEMA
    Offline

    ZEMA Опытный в 1С

    Регистрация:
    5 окт 2007
    Сообщения:
    231
    Симпатии:
    0
    Баллы:
    26
    Не серчайте на меня)) Ну почему-то у меня все равно не создается Операция. Вот код:
    Код:
    ЦенаДокС = 0;
    Попытка
    ЦенаДокС = Окр(Число(Слова.Получить(6).Значение), 2);
    Исключение
    Если Слова.Получить(6).Значение = "" Тогда
    ЦенаДокС = 0;
    Иначе
    Сообщить("В строке " + н + "некорректное значение суммы " + Слова.Получить(6).Значение);
    Сообщить("!!!Документ переоценка товара не будет создан в программе. Требуется повторная загрузка.");
    Возврат;
    КонецЕсли;
    КонецПопытки;
    
    ЦенаДокН = 0;
    Попытка 
    ЦенаДокН = Окр(Число(Слова.Получить(7).Значение), 2);
    Исключение      		
    Если Слова.Получить(7).Значение = "" Тогда
    ЦенаДокН = 0;
    Иначе
    Сообщить("В строке " + н + "некорректное значение суммы " + Слова.Получить(6).Значение);
    Сообщить("!!!Документ переоценка товара не будет создан в программе. Требуется повторная загрузка.");
    Возврат;
    КонецЕсли;
    КонецПопытки;
    
    
    
    //Ищем или создаем складотправитель
    Склад = Справочники.Склады.ПустаяСсылка();
    ПоискСклада(Склад, СокрЛП(Слова.Получить(4).Значение), СокрЛП(Слова.Получить(5).Значение)); 
    
    //Ищем или создаем документ возврат товаров поставщику
    //уникально номер + склад
    ДокНайден = 0;
    ДокВыборка = Документы.ОперацияБух.Выбрать(ДатаДока-2*60*60*24,ДатаДока+2*60*60*24-1);
    Пока ДокВыборка.Следующий() Цикл
    Если Найти(ДокВыборка.Комментарий,НомерДокаВАптеке + "_" + СокрЛП(Склад.Код)) Тогда
    Док = ДокВыборка.ПолучитьОбъект();
    ДокНайден = 1;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    НачатьТранзакцию();
    
    Если ДокНайден = 1 Тогда
    Сообщить("Найден документ! "+Док+"("+НомерДокаВАптеке+")"+" документ будет изменен!!!");
    Если Док.Проведен Тогда
    Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
    КонецЕсли;
    Если Док.ПометкаУдаления Тогда
    Сообщить("Документ " + Док +"("+НомерДокаВАптеке+")"+ " был помечен на удаление!!!");
    Док.УстановитьПометкуУдаления(Ложь);
    КонецЕсли;
    Иначе
    Док=Документы.ОперацияБух.СоздатьДокумент();
    КонецЕсли;
    
    //заполняем шапку
    Док.Дата          = датаДока;	
    Док.Организация   = Справочники.Организации.НайтиПоКоду("000000000001").Ссылка;
    Док.Комментарий   = НомерДокаВАптеке + "_" + СокрЛП(Склад.Код);
    Док.Ответственный = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойОтветственный");
    Док.Записать();
    
    ДокСсылка = Док.Ссылка;
    РегХозрасчетный = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    РегХозрасчетный.Отбор.Регистратор.Значение = ДокСсылка;
    
    Если  ЦенаДокН-ЦенаДокС <> 0 Тогда
    
    Проводка = РегХозрасчетный.Добавить(); 
    Проводка.Содержание  = "";                                                                               
    Проводка.Период      = Док.Дата;
    Проводка.Организация = Док.Организация;
    Проводка.СчетДт      = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.02");
    Проводка.СчетКт      = ПланыСчетов.Хозрасчетный.НайтиПоКоду("42");
    Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады]                            = Склад;
    Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура]                      = Справочники.Номенклатура.НайтиПоКоду("00000001674").Ссылка;
    Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("Переоценка")] = Справочники.Субконто.НайтиПоКоду("000000001");
    Проводка.Сумма       = ЦенаДокН-ЦенаДокС;
    Если Проводка.Сумма<0 Тогда
    Проводка.КоличествоДт=-Проводка.Сумма;
    КонецЕсли;	
    Док.СуммаОперации = Проводка.Сумма;
    
    КонецЕсли; 
    
    РегХозрасчетный.Записать();
    Док.Записать();
    
    
  5. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.566
    Симпатии:
    717
    Баллы:
    204
    Делаем так
    - РегХозрасчетный.Отбор.Регистратор.Установить(ДокСсылка);
    - ДОК.ЗАписать() Убираем совсем.
    - распроводить документ не нужно
    - ставим таки ЗафиксироватьТранцакцию() после РегХозрасчетный.Записать()
  6. TopicStarter Overlay
    ZEMA
    Offline

    ZEMA Опытный в 1С

    Регистрация:
    5 окт 2007
    Сообщения:
    231
    Симпатии:
    0
    Баллы:
    26
    Если я в коде пишу
    Код:
    - РегХозрасчетный.Отбор.Регистратор.Установить(ДокСсылка);
    
    
    , то программа ругается не установлен отбор по регистратору(((
  7. TopicStarter Overlay
    ZEMA
    Offline

    ZEMA Опытный в 1С

    Регистрация:
    5 окт 2007
    Сообщения:
    231
    Симпатии:
    0
    Баллы:
    26
    Всем спасибо, тема закрыта. Нужно было еще в модуле хозрасчета довнести изменения
Похожие темы
  1. AlexFIG
    Ответов:
    2
    Просмотров:
    721
Загрузка...

Поделиться этой страницей