Методические рекомендации по подготовке к экзамену 1С:Специалист по платформе 1С:Предприятие 8.0

Материал из КинтВики
Перейти к: навигация, поиск


Источник: http://www.klerk.ru/soft/articles/16568/

Постоянный адрес статьи: http://1cv8.comp.bashnet.ru/

Автор: Альберт Балаков, сотрудник фирмы-партнера «1С», специалист по разработке и внедрению решений на платформе «1С:Предприятие»

Электронная почта: 1cv8@bashnet.ru

Дата написания: ноябрь 2004 г.

Общие положения.

«1С:Предприятие 8.0» не разделяется на компоненты, поэтому экзамен сдается сразу по трем направлениям: оперативный учет, бухгалтерский учет, сложные периодические расчеты.

Внимательно ознакомьтесь с официальным документом «Экзамен 1С:Специалист по платформе 1С:Предприятие 8.0», расположенным на сайте фирмы «1С» (Приложение 4). Ниже будет проведен разбор требований, изложенных в этом документе.

Для подготовки желательно иметь книги М.Г. Радченко «Практическое пособие разработчика» и С.А. Митичкина «Разработка в системе 1С:Предприятие 8.0». Хочу особо обратить внимание на книгу М.Г. Радченко, где на сквозном примере, подробно описывается методика применения основных объектов конфигурации.

Можно воспользоваться методической поддержкой, предоставляемой на дисках ИТС. На них публикуются статьи и демонстрационные конфигурации, позволяющие глубже понять механизмы работы 1С:Предприятия.

Помимо самостоятельной подготовки, есть возможность пройти курсы в Центрах Сертифицированного Обучения (ЦСО). Более подробно об этом см. www. v 8.1 c. ru и www.1 c. ru . Судя по отзывам слушателей, курсы ЦСО очень эффективны, т.к. на них разбираются типовые примеры и подходы, реализацию которых и будут ожидать от Вас на экзамене.

Выделю моменты, существенные для успешной сдачи экзамена.

  • В период подготовки выполните как можно больше примеров сертификационных заданий. Тренироваться желательно «в боевых условиях», засекайте время и постарайтесь полностью решить задачу. Дополнительные примеры заданий Вы можете найти в сети (Приложение 4).
  • Получив задание, не начинайте решение, пока полностью не проанализируйте его. Нередки случаи, когда, например, расчетная часть использует данные оперативного учета или для построения отчета требуется не оговоренный специально разрез аналитического учета. В этом случае, если что-то уже реализовано, то придется переделывать.
  • Пользовательский интерфейс, если это не оговорено специально, не играет значительной роли. Не тратьте время на оформление или добавление полезных, но не обязательных возможностей. Сосредоточьтесь на функционале задачи, остальное доделаете, если останется время.
  • Если что-то не получается, отложите это и максимально сделайте то, что можете. Чем больше решено подзадач, пусть и небольших, тем лучше.
  • Следует четко понимать, какие части программы, где располагать. Например, алгоритм расчета начислений и удержаний должен располагаться в общем модуле; в модуле формы желательно разместить только то, что существенно для работы формы как объекта интерактивного взаимодействия с пользователем; и т.д.
  • Разберитесь с неясными моментами до аттестации. Экзаменационные 4 часа рассчитаны на то, что Вы знаете как реализовать функционал, и времени на книги и синтакс-помощник остается мало.
  • Изучите объекты метаданных, присутствующие в каркасной конфигурации. Ознакомьтесь, какие регистры, справочники и документы уже заполнены.

Особенности сдачи сертификационного экзамена.

У каждого экзаменатора свои особенности проведения экзамена. У некоторых экзаменуемых была возможность решать задачу более четырех часов из-за того, что задания проверяются последовательно. Однако следует быть готовым к тому, что по окончании отведенного времени всех одновременно попросят сохранить внешние отчеты в составе конфигурации, сделать выгрузку информационной базы и пройти на собеседование.

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

Реализация основных механизмов.

В книге М.Г. Радченко подробно рассмотрена реализация большинства необходимых механизмов. Для лучшего понимания дальнейшего материала рекомендуется разобраться с примерами книги.

На сайте статьи выложены две конфигурации, являющиеся приложением к данному материалу. За основу этих демонстрационных примеров принята каркасная конфигурация.

  • Конфигурация «Работа с регистрами накопления, бухгалтерии и расчета». В этой конфигурации продемонстрирована реализация контроля остатка и средневзвешенного списания по регистрам остатков и бухгалтерии. В ней же реализованы затронутые ниже вопросы работы с регистрами расчета и организации валютного учета.
  • Конфигурация «Партионное списание» - название говорит само за себя.

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

  • Приложение 1 - пример программного кода модуля документа «Расходная», реализующего контроль остатка и средневзвешенного списания по регистрам остатков и бухгалтерии.
  • Приложение 2 - пример программного кода модуля документа «Расходная», реализующего партионное списание по методу FIFO.
  • Приложение 3 - пример программного кода модуля документа «Начисление зарплаты», позволяющий, в частности, обрабатывать внесение записей в текущем расчетном периоде за прошлый.
  • Приложение 4 - список ресурсов сети, полезных для подготовки к экзамену.

Далее во фрагментах кода используется функция обПроверкаНаNULL(), расположенная в общем модуле «Общий».

Функция обПроверкаНаNULL( ЛПараметр ) Экспорт

                Возврат ?( ЛПараметр=NULL, 0, ЛПараметр );

КонецФункции

Запросы.

Универсальный механизм, лежащий в основе эффективного взаимодействия почти со всеми объектами 1С:Предприятия 8.0 – это запросы. Запросы подробно описаны в документации, книгах и статьях на дисках ИТС.

У человека, знакомого с версией 7.7, может возникнуть искушение выполнить запрос и выгрузить результат в таблицу значений для дальнейшей обработки. Однако, грамотно построенный запрос, способен взять на себя множество функций по обработке выбранной информации.

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

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	ОстаткиНоменклатурыОстатки.Номенклатура,
|	ОстаткиНоменклатурыОстатки.КоличествоОстаток,
|	ОстаткиНоменклатурыОстатки.СуммаОстаток
|ИЗ
|	РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени,
 Номенклатура В (&СписокНоменклатуры)) КАК ОстаткиНоменклатурыОстатки";

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

Выборка = Запрос.Выполнить().Выбрать();

Для каждого СтрокаДокумента Из Товары Цикл
	СтруктураПоиска = Новый Структура("Номенклатура", СтрокаДокумента.Номенклатура);
	
	ФактКол = 0; ФактСум = 0;
	Выборка.Сбросить();
	// найдем в выборке требуемую Номенклатуру
	Если Выборка.НайтиСледующий( СтруктураПоиска ) Тогда
		ФактКол = Выборка.КоличествоОстаток;
		ФактСум = Выборка.СуммаОстаток;
	КонецЕсли;... 
КонецЦикла;

В приведенном примере запрос выполняется один раз. Затем, перебирая строки документа, ищем в выборке нужную строку и считываем данные.

Еще один прием, позволяющий контролировать результат запроса в период отладки.

Результат = Запрос.Выполнить();
	// выгружаем результат запроса в ТЗ и инициируем выбор строки
	Результат.Выгрузить().ВыбратьСтроку();

Организация контроля остатка и средневзвешенного списания по регистрам остатков и бухгалтерии.

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

Обратите внимание (выдержка из официального документа с сайта фирмы «1С»): «Не следует использовать обычные (не оборотные) субконто для хранения данных и контроля оборотных по своей сути показателей (не требующих хранения остатков)».

Например, если Вы завели субконто на счете Капитал, используемом для формирования финансового результата (прибыли или убытка), то, вероятнее всего, на нем не потребуется хранить остатки – т.е. субконто будет оборотным.

Пример программного кода модуля документа «Расходная» приведен в Приложении 1.


Организация партионного списания.

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

Приведу пример простейшей реализации партионного учета.

В регистр «ОстаткиНоменклатуры» добавьте измерение «Документ» - он будет идентифицировать партии товаров. Исправьте проведение «Приходной накладной» так, чтобы осуществлялось движение по новому измерению. При проведении «Расходной накладной» нужно развернуть запросом остаток конкретной номенклатуры по документам прихода и последовательно списать. Если используется метод списания FIFO – документы в запросе сортируются по возрастанию даты, если LIFO – по убыванию.

Пример программного кода модуля документа «Расходная», реализующего партионное списание по методу FIFO , приведен в Приложении 2.


Организация валютного учета.

Часто в аттестационном задании требования формулируются очень кратко, что подразумевает понимание особенностей валютного учета, поэтому немного теории.

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

Курсовая разница возникает по денежным средствам, номинал которых выражен в валюте, отличной от валюты бухгалтерского учета. Так как курс постоянно изменяется, то на отчетную дату произведение валютной суммы на курс валюты, будет отличаться от соответствующей рублевой суммы. Если (валютная сумма) * (курс валюты) > (сумма в валюте бухгалтерского учета), то это называется положительной курсовой разницей и в бухгалтерском учете отражается как внереализационный доход, иначе – отрицательной курсовой разницей (внереализационный расход).

Рассмотрим организацию валютного учета на примере. Пусть требуется вести валютный учет на счете «Касса» плана счетов «Управленческий», причем разрешается корреспонденция валютного и невалютного счетов.

Для организации валютного учета добавьте в план счетов новый признак учета – «Валютный» и установить этот признак у предопределенного счета «Касса».

В регистр бухгалтерии добавьте измерение «Валюта» с типом «СправочникСсылка.Валюты» и неактивным флажком «Балансовый». Добавьте ресурс «ВалютнаяСумма». Баланс по валютной сумме не требуется, поэтому снимите флажок «Балансовый».

В форме документа «Операция» и форме списка журнала документов «ЖурналОпераций» разместите колонки «ВалютаДт», «ВалютнаяСуммаДт», «ВалютаКт» и «ВалютнаяСуммаКт».

Обратите внимание (выдержка из официального документа с сайта фирмы «1С»): «Ошибкой считается использование балансовых измерений регистра бухгалтерии для решения задач, не требующих получения баланса по реализуемому срезу».

Пример запроса, разворачивающего счет «Касса» по валютам:

ВЫБРАТЬ
	УправленческийОстатки.Валюта,
	УправленческийОстатки.СуммаОстатокДт,
	УправленческийОстатки.ВалютнаяСуммаОстатокДт
ИЗ
	РегистрБухгалтерии.Управленческий.Остатки(&Дата, Счет = &СчетКасса, , ) КАК УправленческийОстатки


Сложные периодические расчеты.

Работа с данными графиков по фактическому периоду действия.

В каркасной конфигурации регистр сведений «ГрафикиРаботы» содержит информацию обо всех возможных графиках. Это сделано добавлением измерения типа «СправочникСсылка.ГрафикиРаботы». Для того чтобы указать, какой график использовать при запросах к виртуальной таблице «ДанныеГрафика», в регистр расчета следует добавить реквизит «График» типа «СправочникСсылка.ГрафикиРаботы» и в поле «Связь с графиком» указать измерение регистра сведений «ГрафикРаботы».

Замечание. В книге М.Г. Радченко при обработке запроса к виртуальной таблице данных графика регистра расчета не осуществляется проверка на NULL. Поэтому при расчете начислений в периоде, где данные графика не заполнены «книжный» алгоритм выдает ошибку.

Рекомендую исправить код следующим образом:

Норма = обПроверкаНаNULL( ВыборкаРезультата.Норма );
Факт   = обПроверкаНаNULL( ВыборкаРезультата.Факт );
Если Норма =0 Тогда
    …

Вы можете убедиться в сказанном, проведя документ «Начисление зарплаты» № 3 от 01.12.2004 из конфигурации «Работа с регистрами накопления, бухгалтерии и расчета», прилагаемой к данной статье.


Работа с вытесняющими расчетами – получение дополнения.

Необходимость в получении дополнения возникает в том случае, если требуется внести записи в текущем расчетном периоде за прошлый.

Предположим, на предприятии больничный лист оплачивается из расчета 500 руб. в день. В декабре выяснилось, что при расчете зарплаты в ноябре не учтен больничный лист. Требуется в текущем периоде (декабре) сторнировать ноябрьское начисление по окладу, приходящееся на время больничного листа, и провести начисление по больничному листу.

В программе это отражается следующим образом. В план видов расчета вносим виды расчета – «Оклад» и «Больничный», причем первый вытесняется вторым. Вносим запись регистра расчета (вид расчета – «Больничный»), период регистрации которой – в декабре, а период действия – в ноябре. После сохранения записи появляется возможность получить дополнение. Замечу, что дополнение возникает только в том случае, если период регистрации и период действия записи регистра расчета располагаются в различных расчетных периодах.

Полученное дополнение представляет собой таблицу значений, содержащую вытесненные записи (для нашего примера их видом расчета будет «Оклад») и дополнительные поля «ПериодДействияНачалоСторно» и «ПериодДействияКонецСторно» (для более подробной информации см. книги комплекта поставки).

Выдержка из аттестационного задания, где требуется применить описанные механизмы: «… Реализовать возможность отгулов в текущем расчетном периоде за прошлый. При этом, если в предыдущем периоде сотруднику назначалась оплата по окладу, должен срабатывать механизм вытеснения, порождающий сторно ‑ запись, отменяющий часть оклада за период, в котором сотрудник был в отгулах.»

В Приложении 4 приведен программный код модуля документа «Начисление зарплаты», позволяющий обрабатывать внесение записей в текущем расчетном периоде за прошлый.

Примечание: если развивать эту тему, то появляется много сложностей. Например, если внести вид расчета «Премия», имеющий в качестве базового вида расчета «Оклад» и поставить цель корректно обрабатывать перепроведение документов задним числом, или если в прилагаемой к статье конфигурации внести два больничных, пересекающихся периодом действия. Однако цель настоящей статьи продемонстрировать простые механизмы, поэтому сложные моменты оставлены «за скобками».


Работа с базовыми видами расчета – получение базы.

Обращение к виртуальной таблице регистра расчета База<ИмяРегистра> позволяет получить результаты базовых для данного видов расчета.

Замечу, что в каркасной конфигурации, при задании параметров запроса «ИзмеренияОсновного» и «ИзмеренияБазового», следует передавать массив из трех элементов, как показано ниже.

Смысл этого состоит в следующем. Предположим, что некоторый сотрудник совмещает в организации две должности, начисление оклада и премии (процентом к окладу) по которым ведется независимо. Если с помощью массива в запрос передать только одно измерение – «Сотрудник», то база для начисления премии (оклад) будет получена суммарно по всем должностям сотрудника.

Изм = Новый Массив(3);
Изм[0] = "Сотрудник";
Изм[1] = "Подразделение";
Изм[2] = "Должность";

Запрос.УстановитьПараметр("ИзмеренияОсновного", Изм);
Запрос.УстановитьПараметр("ИзмеренияБазового", Изм);

Использование начального сальдо.

Выдержка из аттестационного задания: «…для каждого расчетного периода предусмотреть ввод автоматически рассчитываемого начального сальдо (задолженность организации перед сотрудниками в учетной валюте доллары отдельным документом).

Отчет расчетный листок для вывода результатов.»

Сотрудник Вид расчета Нач. Сальдо Начислено Выплаты
Иванов 100 200 270
Оклад 120
Премия 80
Петров 150 150
Оклад 150
Итоги 100 350 420


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

Общение со сдававшими подобные задания на экзамене показывает, что надо быть готовым к тому, чтобы завести виды расчетов «НачальноеСальдо» и «ВыплатаЗарплаты». Затем сделать регламентный документ, который по сальдо предыдущего месяца, начислениям и выплатам (т.е. по данным регистра расчета) автоматически рассчитает и установит сальдо на начало текущего месяца.


Работа со сводной таблицей.

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

Пример - сводная таблица, демонстрирующая прибыль фирмы в разрезе видов деятельности (строки) и подразделений (колонки):

Результат = Запрос.Выполнить();

Табл = ЭлементыФормы.ПолеТабличногоДокумента1;
СводнаяТабл = Табл.ВстроенныеТаблицы.СводнаяТаблица1;
СводнаяТабл.ИсточникДанных = Результат;
СводнаяТабл.Строки.Добавить( СводнаяТаблица.Поля.ВидыДеятельности );
СводнаяТабл.Колонки.Добавить( СводнаяТаблица.Поля.Подразделения );
СводнаяТабл.Данные.Добавить( СводнаяТаблица.Поля.Прибыль );

Приложение 1.

Пример программного кода модуля документа «Расходная», реализующего контроль остатка и средневзвешенного списания по регистрам остатков и бухгалтерии.

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

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

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

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

Приложение 2

Пример программного кода модуля документа «Расходная», реализующего партионное списание по методу FIFO.

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

Приложение 3.

Пример программного кода модуля документа «Начисление зарплаты», позволяющий, в частности, обрабатывать внесение записей в текущем расчетном периоде за прошлый.

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

Приложение 4.

Список ресурсов сети, полезных для подготовки к экзамену.