7.7 ТаблицаЗначений+Проводка(

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем змейкин, 15 апр 2013.

  1. TopicStarter Overlay
    змейкин
    Offline

    змейкин Опытный в 1С

    Регистрация:
    25 мар 2013
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Народ как из таблицы значений сделать проводку?.Например мне по списанию материалов глПроводка(работает)вроде все правильно
    сделал но все равно операция пуста(
    Код:
    Перем Тз, ТзМат;
    // **************************************
    Функция ПроверкаШапки()
    
    Если Подразделение.Выбран()=0 Тогда
    Возврат 0;
    ИначеЕсли МестоХранения.Выбран()=0 Тогда
    Возврат 0;
    Иначе
    Возврат 1;
    КонецЕсли;
    
    КонецФункции
    //**************************************
    Функция ПроверкаСтроки()
    
    Возврат 1;
    КонецФункции
    //**************************************
    Процедура РассчитатьШапку()
    
    Тз = СоздатьОбъект("ТаблицаЗначений");
    Тз.НоваяКолонка("Продукция","Справочник.ТМЦ");
    Тз.НоваяКолонка("КвоПр","Число",10,3);
    Тз.НоваяКолонка("СмПр","Число",10,2);
    Тз.НоваяКолонка("Материал","Справочник.ТМЦ");
    Тз.НоваяКолонка("КвоМат","Число",10,3);
    Тз.НоваяКолонка("СмМат","Число",10,2);
    КонецПроцедуры
    //**************************************
    Процедура РассчитатьСтроку()
    
    ДокНЗ = СоздатьОбъект("Документ.НормыЗатрат");
    
    Дата1 = НачМесяца(ДатаДок);
    Дата2 = ДатаДок;
    
    ТекНормы = ПолучитьПустоеЗначение("Документ.НормыЗатрат");
    
    ДокНЗ.ОбратныйПорядок(1);
    ДокНЗ.ВыбратьДокументы(Дата1,Дата2);
    
    Пока ДокНЗ.ПолучитьДокумент()>0 Цикл
    Если ДокНЗ.Фирма <> Фирма Тогда
    Продолжить;
    КонецЕсли;
    Если ДокНЗ.Продукция = ТМЦ Тогда
    ТекНормы = ДокНЗ.ТекущийДокумент();
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    Если ТекНормы.Выбран()=0 Тогда
    Сообщить("Не найдены нормы на продукцию "+ ТМЦ);
    Возврат;
    КонецЕсли;
    
    КоэфПересч = ТекНормы.Количество;
    
    ТекНормы.ВыбратьСтроки();
    
    Пока ТекНормы.ПолучитьСтроку()>0 Цикл
    
    Тз.НоваяСтрока();
    Тз.Продукция = ТМЦ;
    Тз.Материал =  ТекНормы.Элемент;
    Тз.КвоМат = ТекНормы.К_во/КоэфПересч;
    Тз.СмМат = ТекНормы.Сумма/КоэфПересч;
    Тз.СмПр = Тз.СмМат;
    Конеццикла;
    КонецПроцедуры
    
    //**************************************
    Процедура ПроводкиМатериалы()
    ТзМат = СоздатьОбъект("ТаблицаЗначений");
    ТзМат.ВыбратьСтроки();
    Пока ТзМат.ПолучитьСтроку()>0 Цикл
    глПроводка(Контекст,"23","201",Сумма,"Списание Материалов","КвоМат",Подразделение,ВидДеятельности,"Материал",,"Проводка");
    КонецЦикла;
    ТзМат.Свернуть("Материал","КвоМат,СмМат");
    
    КонецПроцедуры
    //**************************************
    Процедура ПроводкиПродукция()//проводка по продукции(
    
    Тз.Свернуть("Продукция","КвоПр,СмПр");
    
    ТзДок = СоздатьОбъект("ТаблицаЗначений");
    ВыгрузитьТабличнуюЧасть(ТзДок,"ТМЦ,К_во");
    
    ТзДок.ВыбратьСтроки();
    Пока ТзДок.ПолучитьСтроку()>0 цикл
    // 1 й вариант
    
    Тз.НоваяСтрока();
    Тз.Продукция = ТзДок.ТМЦ;
    Тз.КвоПр = ТзДок.К_во;
    
    КонецЦикла;
    Тз.Свернуть("Продукция","КвоПр,СмПр");
    
    Проводка();
    КонецПроцедуры
    
    //**************************************
    Процедура ОбработкаПроведения()
    Если ПроверкаШапки()=0 Тогда
    СтатусВозврата(0);
    КонецЕсли;
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 Цикл
    ПроверкаСтроки();
    КонецЦикла;
    
    РассчитатьШапку();
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 Цикл
    РассчитатьСтроку();
    КонецЦикла;
    
    Тз.Выгрузить(ТзМат);
    
    Тз.ВыбратьСтроку();
    
    // Списание материалов
    ТзМат.ВыбратьСтроки();
    Пока ТзМат.ПолучитьСтроку()>0 Цикл
    ПроводкиМатериалы();
    КонецЦикла;
    ПроводкиМатериалы();
    
    
    // проводки по продукции
    
    ПроводкиПродукция();
    Тз.ВыбратьСтроку();
    Операция.СуммаОперации = Итог("Сумма");
    Операция.Содержание = Примечание;
    Операция.Записать();
    
    КонецПроцедуры
    Код:
    глПроводка(Конт,СчД,СчК,Сумма,Сод,Кво,СубД1,СубД2,СубК1,СубК2,Режим)
    Параметры проводки)
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не знаю что у вас там содержится в процедуре глПроводка, но суд по всему вы в ней ни какую операцию не создаете. + Что за процедура Проводка, вызываемая в ПроводкиПродукции?
  3. Vlan
    Online

    Vlan Гость Гость

    Вот это вообще ни о чем:

    Код:
    Процедура ПроводкиМатериалы()
    ТзМат = СоздатьОбъект("ТаблицаЗначений");
    //здесь нужно чем-то таблицу заполнить
    ТзМат.ВыбратьСтроки();
    Пока ТзМат.ПолучитьСтроку()>0 Цикл
    глПроводка(Контекст,"23","201",Сумма,"Списание Материалов","КвоМат",Подразделение,ВидДеятельности,"Материал",,"Проводка");
    КонецЦикла;
    ТзМат.Свернуть("Материал","КвоМат,СмМат");
    
    КонецПроцедуры
    Вы создаете таблицу значений и пытаетесь пробежаться по ее строкам. А их нет, откуда они возьмутся? Я предполагаю, что туда должна быть скопирована уже имеющаяся таблица.
  4. Vlan
    Online

    Vlan Гость Гость

    Либо убирать создание таблицы из ПроводкиМатериалы().
    Вижу, что в ОбработкеПроведения() эта таблица уже заполняется, так зачем каждый раз в цикле ее заново создавать?
    Плюс получается, что начав цикл в ОбработкеПроведения, вы опять запускаете этот же цикл в ПроводкиМатериалы. Я бы на месте 1С возмутился и выдал какую-нибудь чушь вместо верного результата.
  5. TopicStarter Overlay
    змейкин
    Offline

    змейкин Опытный в 1С

    Регистрация:
    25 мар 2013
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Поправил немного теперь блин опять не пойму почему всегда выдается последнее значение в операции.Например у меня 3 вида продукции
    Батон 1,Батон2,Батон3 так вот в операции просто Батон 3 выдаеться 3 раза(
    Код:
    Перем Тз, ТзМат;
    // **************************************
    Функция ПроверкаШапки()
    
    Если Подразделение.Выбран()=0 Тогда
    Возврат 0;
    ИначеЕсли МестоХранения.Выбран()=0 Тогда
    Возврат 0;
    Иначе
    Возврат 1;
    КонецЕсли;
    
    КонецФункции
    //**************************************
    Функция ПроверкаСтроки()
    
    Возврат 1;
    КонецФункции
    //**************************************
    Процедура РассчитатьШапку()
    
    Тз = СоздатьОбъект("ТаблицаЗначений");
    Тз.НоваяКолонка("Продукция","Справочник.ТМЦ");
    Тз.НоваяКолонка("КвоПр","Число",10,3);
    Тз.НоваяКолонка("СмПр","Число",10,2);
    Тз.НоваяКолонка("Материал","Справочник.ТМЦ");
    Тз.НоваяКолонка("КвоМат","Число",10,3);
    Тз.НоваяКолонка("СмМат","Число",10,2);
    КонецПроцедуры
    //**************************************
    Процедура РассчитатьСтроку()
    
    ДокНЗ = СоздатьОбъект("Документ.НормыЗатрат");
    
    Дата1 = НачМесяца(ДатаДок);
    Дата2 = ДатаДок;
    
    ТекНормы = ПолучитьПустоеЗначение("Документ.НормыЗатрат");
    
    ДокНЗ.ОбратныйПорядок(1);
    ДокНЗ.ВыбратьДокументы(Дата1,Дата2);
    
    Пока ДокНЗ.ПолучитьДокумент()>0 Цикл
    Если ДокНЗ.Фирма <> Фирма Тогда
    Продолжить;
    КонецЕсли;
    Если ДокНЗ.Продукция = ТМЦ Тогда
    ТекНормы = ДокНЗ.ТекущийДокумент();
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    Если ТекНормы.Выбран()=0 Тогда
    Сообщить("Не найдены нормы на продукцию "+ ТМЦ);
    Возврат;
    КонецЕсли;
    
    КоэфПересч = ТекНормы.Количество;
    
    ТекНормы.ВыбратьСтроки();
    
    Пока ТекНормы.ПолучитьСтроку()>0 Цикл
    
    Тз.НоваяСтрока();
    Тз.Продукция = ТМЦ;
    Тз.Материал =  ТекНормы.Элемент;
    Тз.КвоМат = ТекНормы.К_во/КоэфПересч;
    Тз.СмМат = ТекНормы.Сумма/КоэфПересч;
    Тз.СмПр = Тз.СмМат;
    Конеццикла;
    КонецПроцедуры
    
    //**************************************
    Процедура ПроводкиМатериалы()
    ТзМат = СоздатьОбъект("ТаблицаЗначений");
    глПроводка(Контекст,"23","201",Тз.СмМат,"Списание Материалов",Тз.КвоМат,Подразделение,ВидДеятельности,Тз.Материал,,"Проводка");
    ТзМат.Свернуть("Материал","КвоМат,СмМат");
    КонецПроцедуры
    //**************************************
    Процедура ПроводкиПродукция()
    
    Тз.Свернуть("Продукция","КвоПр,СмПр");
    
    ТзДок = СоздатьОбъект("ТаблицаЗначений");
    ВыгрузитьТабличнуюЧасть(ТзДок,"ТМЦ,К_во,Сумма");
    
    ТзДок.ВыбратьСтроки();
    Пока ТзДок.ПолучитьСтроку()>0 цикл
    // 1 й вариант
    Тз.НоваяСтрока();
    Тз.Продукция = ТзДок.ТМЦ;
    Тз.КвоПр = ТзДок.К_во;
    Тз.СмПр= ТзДок.Сумма;
    КонецЦикла;
    глПроводка(Контекст,"26","23",Сумма,"ГотоваяПродукция",Тз.КвоПр,Тз.Продукция,МестоХранения,Подразделение,ВидДеятельности,"Проводка");
    
    Тз.Свернуть("Продукция","КвоПр,СмПр");
    
    
    
    КонецПроцедуры
    
    //**************************************
    Процедура ОбработкаПроведения()
    Если ПроверкаШапки()=0 Тогда
    СтатусВозврата(0);
    КонецЕсли;
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 Цикл
    ПроверкаСтроки();
    КонецЦикла;
    
    РассчитатьШапку();
    Если фСписыватьМатериалы=1 Тогда
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 Цикл
    РассчитатьСтроку();
    ПроводкиМатериалы();
    Тз.ВыбратьСтроку();
    //Операция.СуммаОперации = Итог("Сумма");
    КонецЦикла;
    Иначе
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 Цикл
    ПроводкиПродукция();
    //Операция.СуммаОперации = Итог("Сумма");
    Тз.ВыбратьСтроку();
    КонецЦикла;
    КонецЕсли;
    Тз.Выгрузить(ТзМат);
    Операция.Содержание = Примечание;
    Операция.Записать();
    
    КонецПроцедуры
    
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Я понимаю что вы дилетант, но не на столько же.........
    Ошибки и "ляпы"
    • РассчитатьСтроку()
    1) в случае если нет документа НормыПасходов по ТМЦ вы выводите сообщение и при этом пытаетесь формировать проводку (цикл по материалам)
    2) если тупой юзер не указал количество в затратах у вас будет деление на 0 (поставьте проверку)
    3) не очищаете ТЗ при вызове процедуры. Сответственно если у вас 2 строки и больше предыдущие затраты приплюсуются к предыдущим
    смотрите сами...
    Код:
    Если фСписыватьМатериалы=1 Тогда
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 Цикл
    РассчитатьСтроку(); //тут не очищаете ТЗ
    ПроводкиМатериалы();
    Тз.ВыбратьСтроку(); //хотите посмотреть что получилось? в модуле проведения крайне не желательно открывать модальные окна.
    //Операция.СуммаОперации = Итог("Сумма");
    КонецЦикла;
    
    Код:
    Процедура ПроводкиМатериалы()
    ТзМат = СоздатьОбъект("ТаблицаЗначений"); //зачем создаете когда нигде не используете?
    глПроводка(Контекст,"23","201",Тз.СмМат,"Списание Материалов",Тз.КвоМат,Подразделение,ВидДеятельности,Тз.Материал,,"Проводка");
    ТзМат.Свернуть("Материал","КвоМат,СмМат"); //это тоже не понятно
    КонецПроцедуры			   
    


    Код:
    Процедура ПроводкиПродукция()
    
    Тз.Свернуть("Продукция","КвоПр,СмПр"); //зачем конда таблица пустая?
    
    ТзДок = СоздатьОбъект("ТаблицаЗначений");
    ВыгрузитьТабличнуюЧасть(ТзДок,"ТМЦ,К_во,Сумма");
    
    ТзДок.ВыбратьСтроки();
    Пока ТзДок.ПолучитьСтроку()>0 цикл
    // 1 й вариант
    Тз.НоваяСтрока();
    Тз.Продукция = ТзДок.ТМЦ;
    Тз.КвоПр = ТзДок.К_во;
    Тз.СмПр= ТзДок.Сумма;
    КонецЦикла;
    глПроводка(Контекст,"26","23",Сумма,"ГотоваяПродукция",Тз.КвоПр,Тз.Продукция,МестоХранения,Подразделение,ВидДеятельности,"Проводка"); //обращаетесь к строкам ТЗ вне цикла и что вы хотите получить?
    //поэтому то и одна проводка.. 
    
    Тз.Свернуть("Продукция","КвоПр,СмПр"); //а это зачем?
    КонецПроцедуры
    



    Код:
    
    Тз.Выгрузить(ТзМат); //убрать за не надобностью
    Операция.Содержание = Примечание;
    Операция.Записать();
    
    
  7. TopicStarter Overlay
    змейкин
    Offline

    змейкин Опытный в 1С

    Регистрация:
    25 мар 2013
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Поисправлял ошибки)как вы сказали)все работает только хотелось еще сделать так чтобы в самой операции у меня свернулись проводки как в тз)Например
    у меня батон 1, батон 2, батон 3 Для изготовления батонов использовали муку ,сахар ,корицу итп).Как в самой операции свернуть эти все ингриденты в один общий.Допустим сколько муки,сахара затратили всего на изготовление батонов)В ТЗ так делает а в операции проводки идут отдельно по каждому ингридиенту
    Код:
    Перем Тз, ТзМат;
    // **************************************
    Функция ПроверкаШапки()
    
    Если Подразделение.Выбран()=0 Тогда
    Возврат 0;
    ИначеЕсли МестоХранения.Выбран()=0 Тогда
    Возврат 0;
    Иначе
    Возврат 1;
    КонецЕсли;
    
    КонецФункции
    //**************************************
    Функция ПроверкаСтроки()
    
    Возврат 1;
    
    КонецФункции
    //**************************************
    Процедура РассчитатьШапку()
    
    Тз = СоздатьОбъект("ТаблицаЗначений");
    Тз.НоваяКолонка("Продукция","Справочник.ТМЦ");
    Тз.НоваяКолонка("КвоПр","Число",10,3);
    Тз.НоваяКолонка("СмПр","Число",10,2);
    Тз.НоваяКолонка("Материал","Справочник.ТМЦ");
    Тз.НоваяКолонка("КвоМат","Число",10,3);
    Тз.НоваяКолонка("СмМат","Число",10,2);
    
    КонецПроцедуры
    //**************************************
    Процедура РассчитатьСтроку()
    
    ДокНЗ = СоздатьОбъект("Документ.НормыЗатрат");
    
    Дата1 = НачМесяца(ДатаДок);
    Дата2 = ДатаДок;
    
    ТекНормы = ПолучитьПустоеЗначение("Документ.НормыЗатрат");
    
    ДокНЗ.ОбратныйПорядок(1);
    
    ДокНЗ.ВыбратьДокументы(Дата1,Дата2);
    
    Пока ДокНЗ.ПолучитьДокумент()>0 Цикл
    Если ДокНЗ.Фирма <> Фирма Тогда
    Продолжить;
    КонецЕсли;
    Если ДокНЗ.Продукция = ТМЦ Тогда
    ТекНормы = ДокНЗ.ТекущийДокумент();
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    
    Если ТекНормы.Выбран()=0 Тогда
    Сообщить("Не найдены нормы на продукцию "+ ТМЦ);
    Возврат;
    КонецЕсли;
    
    КоэфПересч = ТекНормы.Количество;
    
    ТекНормы.ВыбратьСтроки();
    
    Пока ТекНормы.ПолучитьСтроку()>0 Цикл
    
    Тз.НоваяСтрока();
    Тз.Продукция = ТМЦ;
    Тз.Материал =  ТекНормы.Элемент;
    Тз.КвоМат = ТекНормы.К_во/КоэфПересч;
    Тз.СмМат = ТекНормы.Сумма/КоэфПересч;
    Тз.СмПр = Тз.СмМат;
    Конеццикла;
    
    КонецПроцедуры
    
    //**************************************
    Процедура ПроводкиМатериалы()
    Тз.ВыбратьСтроки();									
    Пока Тз.ПолучитьСтроку()>0 Цикл
    глПроводка(Контекст,"23","201",Тз.СмМат,"Списание Материалов",Тз.КвоМат,Подразделение,ВидДеятельности,Тз.Материал,,"Проводка");
    
    КонецЦикла;
    Тз.Свернуть("Материал","КвоМат,СмМат");
    КонецПроцедуры
    //**************************************
    Процедура ПроводкиПродукция()
    ТзДок = СоздатьОбъект("ТаблицаЗначений");
    ВыгрузитьТабличнуюЧасть(ТзДок,"ТМЦ,К_во,Сумма");
    
    ТзДок.ВыбратьСтроки();
    Пока ТзДок.ПолучитьСтроку()>0 цикл
    // 1 й вариант
    Тз.НоваяСтрока();
    Тз.Продукция = ТзДок.ТМЦ;
    Тз.КвоПр = ТзДок.К_во;
    Тз.СмПр= ТзДок.Сумма;
    глПроводка(Контекст,"26","23",Тз.СмПр,"ГотоваяПродукция",Тз.КвоПр,Тз.Продукция,МестоХранения,Подразделение,ВидДеятельности,"Проводка");
    
    КонецЦикла;
    КонецПроцедуры
    //**************************************
    Процедура ОбработкаПроведения()
    Если ПроверкаШапки()=0 Тогда
    СтатусВозврата(0);
    КонецЕсли;
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 Цикл
    ПроверкаСтроки();
    КонецЦикла;
    
    РассчитатьШапку();
    Если фСписыватьМатериалы=1 Тогда
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 Цикл
    РассчитатьСтроку();
    КонецЦикла;
    ПроводкиМатериалы();
    Тз.ВыбратьСтроку(); //оставил для проврки удалю)
    Иначе
    ПроводкиПродукция();
    КонецЕсли;
    Операция.Содержание = Примечание;
    Операция.Записать();
    
    
    КонецПроцедуры
    
  8. Vlan
    Online

    Vlan Гость Гость

    Сам же и ответил: копировать свою ТЗ в отдельную ТЗ, которую сворачивать, а потом формировать по ней операции.
  9. TopicStarter Overlay
    змейкин
    Offline

    змейкин Опытный в 1С

    Регистрация:
    25 мар 2013
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Код:
    Тз.Свернуть("Материал","КвоМат,СмМат");
    тут у меня уже содержатся значения Тз свернутые мне еще одну таблицу создатьи формировать проводки ?
  10. Vlan
    Online

    Vlan Гость Гость

    Так надо сначала свернуть, а потом формировать проводки, а не наоборот, как сделано у вас, судя по тексту.
  11. TopicStarter Overlay
    змейкин
    Offline

    змейкин Опытный в 1С

    Регистрация:
    25 мар 2013
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    АААа заработало1!!!круто)ох блин до меня доходит как до жирафа о(
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Часть недочетов так и оставили.... Очень не стабильная конструкция.... Никакой защиты от дурных пользователей + материалы явно должны рассчитываться не правильно при условии что в ТЧ несколько позиций
  13. TopicStarter Overlay
    змейкин
    Offline

    змейкин Опытный в 1С

    Регистрация:
    25 мар 2013
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Защиту поставил в нормах затрат)а с материалами сейчас повожусь
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда уж сделайте так...
    Код:
    Процедура ПроводкиМатериалы()
    Тз.Свернуть("Материал","КвоМат,СмМат"); //сначала свернуть чтобы лишних проводок не плодить
    Тз.ВыбратьСтроки();								   
    Пока Тз.ПолучитьСтроку()>0 Цикл
    глПроводка(Контекст,"23","201",Тз.СмМат,"Списание Материалов",Тз.КвоМат,Подразделение,ВидДеятельности,Тз.Материал,,"Проводка");
    КонецЦикла;
    КонецПроцедуры

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