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