Опубликован: 06.12.2011 | Уровень: специалист | Доступ: платный
Лекция 3:

Бухгалтерская подсистема: расходные документы и переоценка валютных остатков

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Проведение документа РеализацияМатериалов

Добавим в документ РеализацияМатериалов новый реквизитВалюта, тип – СправочникСсылка.Валюты. Мы будем заполнять этот реквизит в том случае, если документ отражает реализацию материалов с взаиморасчетами в валюте. Разместим реквизит на форме документа. Добавим документ в состав подсистемы БухгалтерскийУчет. Включим проведение документа по регистру бухгалтерии Хозрасчетный. Добавим в форму документа команду перехода к регистру бухгалтерии Хозрасчетный ( рис. 3.4).

Обновленная форма документа Реализация материалов

увеличить изображение
Рис. 3.4. Обновленная форма документа Реализация материалов

Документ РеализацияМатериалов уже используется в системе для решения задач оперативного учета материалов, мы оставим процедуру проведения по регистру накопления в исходном состоянии, выполнив лишь небольшие доработки, связанные с возможностью заполнения документа в валюте. Для реализации процедуры проведения документа по бухгалтерскому учету добавим в модуль документа еще одну процедуру следующего вида:

Процедура ОбработкаПроведенияПоБухучету(Отказ)
  
КонецПроцедуры

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

Для проведения документа нам понадобятся следующие данные:

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

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
  //Будем хранить здесь найденный курс валюты или 1, если валюта не задана
  //Если документ отражает реализацию в валюте, мы должны будем учесть это
  //при проведении его не только по бухгалтерскому учету, но и по 
  //регистрам накопления
  Перем КурсВалюты;  
     Если Валюта = Справочники.Валюты.ПустаяСсылка() Тогда
    КурсВалюты=1;
  Иначе
    КурсВалюты=ПолучитьКурсВалюты(Отказ);
  КонецЕсли;
  //Вызываем процедуру проведения по бухгалтерскому учету
  ОбработкаПроведенияПоБухучету(Отказ, КурсВалюты);
  //Приступаем к проведению документа по регистрам накопления
  Запрос = Новый Запрос;
  Запрос.Текст = 
    "ВЫБРАТЬ
    |  ДокМ.Номенклатура,
    |  СУММА(ДокМ.Количество) КАК Количество,
    |  СУММА(ДокМ.Выручка) КАК Выручка,
    |  МАКСИМУМ(ЕСТЬNULL(ОстМ.КоличествоОстаток, 0)) КАК КоличествоОстатков,
    |  МАКСИМУМ(ЕСТЬNULL(ОстМ.СуммаОстаток, 0)) КАК СуммаОстатков
    |ИЗ
    |  Документ.РеализацияМатериалов.Материалы КАК ДокМ
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки
            (&МоментВремени, ОтветственныйСотрудник = &ОтвСотр) КАК ОстМ
    |    ПО ДокМ.Номенклатура = ОстМ.Номенклатура
    |ГДЕ
    |  ДокМ.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |  ДокМ.Номенклатура";

  Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
  Запрос.УстановитьПараметр("ОтвСотр", ОтветственныйСотрудник);
  Запрос.УстановитьПараметр("Ссылка", Ссылка);

  Результат = Запрос.Выполнить();
  ВыборкаДЗ = Результат.Выбрать();
  Движения.ОстаткиМатериалов.Записывать=Истина;
  Движения.Продажи.Записывать=Истина;

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

КонецПроцедуры

Функция ПолучитьКурсВалюты(Отказ)
  //Получаем курс валюты, заданной в документе
      Запрос = Новый Запрос;
      Запрос.Текст = 
        "ВЫБРАТЬ
        |  КурсыВалютСрезПоследних.Курс
        |ИЗ
        |  РегистрСведений.КурсыВалют.СрезПоследних(&МоментВремени, Валюта =
                &Валюта) КАК КурсыВалютСрезПоследних";
        Запрос.УстановитьПараметр("Валюта", Валюта);
      Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
         Результат = Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = Результат.Выбрать();
        Если ВыборкаДетальныеЗаписи.Следующий() Тогда
        Возврат(ВыборкаДетальныеЗаписи.Курс);
      Иначе
        Сообщить("Не найден курс валюты!");
        Отказ=Истина;
      КонецЕсли;
КонецФункции


Процедура ОбработкаПроведенияПоБухучету(Отказ, КурсВалюты)
  Запрос = Новый Запрос;
  Запрос.Текст = 
    "ВЫБРАТЬ
    |  ДокМ.Номенклатура,
    |  СУММА(ДокМ.Количество) КАК Количество,
    |  СУММА(ДокМ.Выручка) КАК Выручка
    |ПОМЕСТИТЬ ДокМТч
    |ИЗ
    |  Документ.РеализацияМатериалов.Материалы КАК ДокМ
    |ГДЕ
    |  ДокМ.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |  ДокМ.Номенклатура
    |;
    |
    |//////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |  ХозрасчетныйОстатки.Субконто1,
    |  СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоОстаток,
    |  СУММА(ВЫБОР
    |      КОГДА ХозрасчетныйОстатки.Субконто2 = &Ответственный
    |        ТОГДА ХозрасчетныйОстатки.КоличествоОстаток
    |    КОНЕЦ) КАК КоличествоЗаОтветственным,
    |  СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК СуммаОстаток
    |ПОМЕСТИТЬ ОстаткиПоСчету
    |ИЗ
    |  РегистрБухгалтерии.Хозрасчетный.Остатки(
    |      &МоментВремени,
    |      Счет = &Счет,
    |      &Субконто,
    |      Субконто1 В
    |        (ВЫБРАТЬ
    |          ДокМТч.Номенклатура
    |        ИЗ
    |          ДокМТч)) КАК ХозрасчетныйОстатки
    |
    |СГРУППИРОВАТЬ ПО
    |  ХозрасчетныйОстатки.Субконто1
    |;
    |
    |/////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |  ДокМТч.Номенклатура,
    |  ДокМТч.Количество,
    |  ДокМТч.Выручка,
    |  ЕСТЬNULL(ОстаткиПоСчету.КоличествоОстаток, 0) КАК КоличествоОстаток,
    |  ЕСТЬNULL(ОстаткиПоСчету.КоличествоЗаОтветственным, 0)
          КАК КоличествоЗаОтветственным,
    |  ЕСТЬNULL(ОстаткиПоСчету.СуммаОстаток, 0) КАК СуммаОстаток
    |ИЗ
    |  ДокМТч КАК ДокМТч
    |    ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиПоСчету КАК ОстаткиПоСчету
    |    ПО ДокМТч.Номенклатура = ОстаткиПоСчету.Субконто1";  
               //Устанавливаем параметры запроса  
  Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
  Запрос.УстановитьПараметр("Ответственный", ОтветственныйСотрудник);
  Запрос.УстановитьПараметр("Ссылка", Ссылка);
  //В этом документе мы имеем дело исключительно со счетом ПрочиеМатериалы
  Запрос.УстановитьПараметр
         ("Счет", ПланыСчетов.Хозрасчетный.ПрочиеМатериалы);
  //Этот массив будет передан в качестве параметра виртуальной таблицы остатков
  //регистра бухгалтерии
  Субконто=Новый Массив(2);
  Субконто[0]=ПланыВидовХарактеристик.ВидыСубконто.Номенклатура;
  Субконто[1]=ПланыВидовХарактеристик.ВидыСубконто.Сотрудники;
  Запрос.УстановитьПараметр("Субконто", Субконто);
  //Выполним запрос
  Результат = Запрос.Выполнить();
    ВыборкаДЗ = Результат.Выбрать();
    //Включаем запись движений по регистру бухгалтерии
    Движения.Хозрасчетный.Записывать=Истина;
  //Обходим полученную выборку
  Пока ВыборкаДЗ.Следующий() Цикл
    //Проверяем, достаточно ли имеющихся материалов для
    //корректного их списания в документе
    Если ВыборкаДЗ.Количество>ВыборкаДЗ.КоличествоЗаОтветственным Тогда
      Сообщить("Недостаточное количество товара (бухучет) "
        +ВыборкаДЗ.Номенклатура+" необходимо "+ВыборкаДЗ.Количество
        +", в наличии "+ВыборкаДЗ.КоличествоЗаОтветственным);
      Отказ=Истина;
      Движения.Хозрасчетный.Записывать=Ложь;
    КонецЕсли;
    Если Отказ Тогда
      //Не идем дальше если Отказ установлен в Истина, то есть
      //движения формироваться не будут
      Продолжить;
    КонецЕсли;
      //Формируем движение вида Дт Капитал Кт Материалы - отражаем себестоимость
    //Даже если документ отражает продажу материалов за валюту
    //Данная запись выглядит так же, как и при расчетах в рублях
    Движение=Движения.Хозрасчетный.Добавить();
    Движение.Период=Дата;
    Движение.СчетДт=ПланыСчетов.Хозрасчетный.Капитал;
    Движение.СчетКт=ПланыСчетов.Хозрасчетный.ПрочиеМатериалы;
    Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура]
          =ВыборкаДЗ.Номенклатура;
    Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудники]
          =ОтветственныйСотрудник;
    Движение.КоличествоКт=ВыборкаДЗ.Количество;
    //Средняя себестоимость в расчете по всем материалам данного вида на счете
    Движение.Сумма=ВыборкаДЗ.Количество*ВыборкаДЗ.СуммаОстаток
        /ВыборкаДЗ.КоличествоОстаток;
//Формируем движение вида Дт РасчетыСПокупателями Кт Капитал - отражаем выручку
//Если в документе указана валюта, это повлияет на дальнейший 
       ход выполнения программы
    Если Валюта = Справочники.Валюты.ПустаяСсылка() Тогда
    //Валюта не задана, формируем движения в рублях, по счету расчетов в рублях
      Движение=Движения.Хозрасчетный.Добавить();
      Движение.Период=Дата;
      Движение.СчетДт=ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиВРублях;
      Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]
            =Покупатель;
      Движение.СчетКт=ПланыСчетов.Хозрасчетный.Капитал;
      Движение.Сумма=ВыборкаДЗ.Выручка;
     Иначе
      //Валюта  задана, формируем движения в валюте, с пересчетом курса
      Движение=Движения.Хозрасчетный.Добавить();
      Движение.Период=Дата;
      Движение.СчетДт=ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиВВалюте;
      Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]
            =Покупатель;
      Движение.ВалютаДт=Валюта;
      Движение.ВалютнаяСуммаДт=ВыборкаДЗ.Выручка;
      Движение.СчетКт=ПланыСчетов.Хозрасчетный.Капитал;
        Движение.Сумма=ВыборкаДЗ.Выручка*КурсВалюты;
        КонецЕсли;
  КонецЦикла;
 КонецПроцедуры
< Лекция 2 || Лекция 3: 123456 || Лекция 4 >
Константин Павлов
Константин Павлов

Почему в лекции 1 "Основы организации бухгалтерской подсистемы" курса "Разработка прикладных решений для платформы 1С:Предприятие 8.2 в режиме "Управляемое приложение"" совершенно нет информации о том что нужно на вкладке данные в табличной части создать табличную часть "ВидыСубконто" и также нет информации о том какие нужно добавить реквизиты и какие у этих реквизитов должен быть тип? Считаю лекцию 1 в данном вопросе недоработанной.

Надежда Федулкина
Надежда Федулкина
Олег Некрасов
Олег Некрасов
Россия
Алексей Васильев
Алексей Васильев
Россия, Новосибирск