Куку, епта!
Для чего предназначены регламентные задания?
Регламентное задание – последовательность действий,
описанных с помощью встроенного языка, с возможностью установки расписания, в
соответствии с которым задание будет автоматически запущено на исполнение.
Как задать расписание для автоматического запуска
заданий?
Находим в древе конфигурации штучку «Регламентные задания» и
правым кликом создаем.
Чтобы установить расписание, жмакаем на ссылку «Открыть»
напротив «Расписание» (рис.1)
рис.1 |
Как обеспечить запуск заданий по расписанию в файловом
варианте работы?
Для файлового режима необходимо создать спецобработку,
которая будет висеть в толстом клиенте и выполнять эти самые задания.
Занятие 21.
Для чего предназначен документ для ввода начальных
остатков и как его создать?
Ну как бы предполагается, что возможен вариант, что 1С
внедряется в уже счуществующую фирму, где уже есть какой-то документооборот,
товары на складе, работники бухают и т.д. И нужно, чтобы в регистрах такие
данные существовали.
Создается такой документ – как и все в 1с, правым кликом.
Разве что для этого документа нужно запретить проведение.
Как программно изменить значение регистра при вводе
начальных остатков?
Мне вообще странно, что в данной теме не рассказали о такой
возможности, как тупо обработкой добавить в регистр данные, не создавая никаких
документов. Поэтому вот пример: есть команда
РегистрыСведений.ИмяВашегоРегистра.СоздатьНаборЗаписей();
— почитайте про неё на досуге, как с её помощью можно
изменять/удалять/модифицировать данные любого регистра.
А в
самом занятии нам предлагается рассмотреть возможность программно изменять
какие-либо параметры либо в модуле формы объекта, либо в модуле объекта.
В
каких случаях использовать модуль формы, а в каких – модуль объекта для
размещения обработчиков событий?
Если
подразумевается возможность программно модифицировать тот или иной объект, то
необходимо пользоваться модулем объекта,
так как при программной записи документа форма жи не открывается, и все ваши
ухищрения пойдут коту под хвост. Такие дела.
В
нашей
информационной
базе,
как
и
в
любой
другой,
следует
предусмотреть
возможность
ввода
начальных
остатков
в
регистры.
Это
необходимо
для
того,
чтобы
пользователи
могли
начать
работу
с
нашей
информационной
базой
не
с
чистого
листа,
а
с
некоторого
исходного
состояния,
которое
было
в
их
прежней
системе
учета
(на
бумаге
например).
Задача
ввода
начальных
остатков
отличается
от
прочих
алгоритмов
изменения
состояния
регистров
тем,
что
подразумевает
изменение
данных
непосредственно
в
регистрах,
без
использования
промежуточных
алгоритмов
(заполнения
документов
данными,
проведения
документов,
контроля
правильности
данных,
указанных
в
документах
и
т.д.).
Рассмотрим
пример
ввода
начальных
остатков
регистра
накопления
ОстаткиМатериалов.
Для
выполнения
этой
задачи
мы
создадим
документ,
в
котором
будем
вручную
редактировать
его
движения
по
регистру
ОстаткиМатериалов
прямо
в
форме
документа.
В
режиме
Конфигуратор
Создадим
новый
объект
документ
с
именем
ВводНачальныхОстатковНоменклатуры.
На
закладке
Движения
запретим
проведение
документа
(поскольку
сами
будем
формировать
записи
регистра)
и
отметим,
что
движения
документа
будут
находиться
в
регистре
накопления
ОстаткиМатериалов.
После
этого
перейдем
на
закладку
Формы
и
создадим
основную
форму
документа.
В
окне
редактора
форм
на
закладке
Реквизиты
раскроем
основной
реквизит
формы
Объект,
затем
раскроем
Движения,
найдем
строку
ОстаткиМатериалов
и
перетащим
ее
в
окно
элементов
формы.
На
вопрос
системы
«добавить
колонки
таблицы?»
ответим
«да».
Немного
изменим
внешний
вид
формы.
В
окне
элементов
формы
добавим
группу
полей
с
типом
группировки
Горизонтальная
и
перетащим
в
нее
поля
документа
Номер
и
Дата.
А
также
поменяем
местами
поля
таблицы
ДвиженияОстаткиМатериаловНаборСвойств
и
Склад.
В
заключение
отредактируем
командный
интерфейс
формы
документа,
чтобы
в
панели
навигации
формы
иметь
возможность
переходить
к
списку
записей
регистра
ОстаткиМатериалов,
связанному
с
документом.
Для
этого
в
левом
верхнем
окне
редактора
форм
перейдем
на
вкладку
Командный
интерфейс.
В
группе
Панель
навигации
в
подгруппе
Перейти
установим
видимость
для
команды
открытия
регистра
Остатки
материалов.
В
окне
редактирования
документа
ВводНачальныхОстатковНоменклатуры
установим
принадлежность
к
подсистеме
Бухгалтерия.
В
заключение
отредактируем
командный
интерфейс
этой
подсистемы
–
Общие
–
Подсистемы
–
Все
подсистемы.
Выделим
в
списке
подсистем
Бухгалтерию
и
в
списке
команд
установим
видимость
команды
Ввод
начальных
остатков
номенклатуры:
создать
в
группе
Панель
действий.Создать.
В
режиме
1С:Предприятие
Запустим
режим
отладки
и
проверим
работу
нашего
документа.
Выполним
команду
Ввод
начальных
остатков
номенклатуры
в
панели
действий
раздела
Бухгалтерия.
Создадим
документ
для
ввода
начальных
остатков
в
регистр
ОстаткиМатериалов
и
внесем
в
него
следующие
данные.
Обратите
внимание,
что
дата
документа
не
совпадает
с
датами
отдельных
записей,
которые
мы
создаем
в
движениях
документа.
Нажмем
Записать
и
в
панели
навигации
перейдем
к
движениям
нашего
документа
в
регистре
ОстаткиМатериалов.
Таким
образом,
мы
добились
поставленной
цели:
с
одной
стороны,
задавая
дату
документа,
мы
можем
фиксировать
момент
внесения
изменений
в
записи
регистра,
с
другой
стороны
–
для
каждой
создаваемой
нами
записи
регистра
мы
можем
указать
индивидуальное
значение
поля
Период.
Теперь
займемся
ужесточением
требований
к
тому,
как
наш
документ
формирует
записи
регистра,
и
рассмотрим
два
типичных
варианта.
Программное
редактирование
записей
регистра
В
режиме
Конфигуратор
Первое
требование
будет
заключаться
в
том,
что
записи
регистра
должны
формироваться
той
же
датой,
что
и
дата
документа.
Иначе
говоря,
синхронизируем
дату
движений
с
датой
документа.
Для
этого
создадим
для
формы
документа
обработчик
события
ПередЗаписью
и
добавим
в
него
следующий
текст.
&НаКлиенте
Процедура
ПередЗаписью(Отказ,
ПараметрыЗаписи)
Для
Каждого
ЗаписьРегистра
Из
Объект.Движения.ОстаткиМатериалов
Цикл
ЗаписьРегистра.Период
=
Объект.Дата;
КонецЦикла;
КонецПроцедуры
В
режиме
1С:Предприятие
Запустим
отладку,
откроем
наш
документ
и
нажмем
Записать.
Открыв
движения
документа
в
регистре
ОстаткиМатериалов,
увидим,
что
значение
поля
Период
у
всех
записей
стало
равно
дате
документа.
Можно
сказать,
что
мы
достигли
поставленной
цели,
но
лишь
для
интерактивной
записи
документа.
Если
программно
вызвать
метод
Записать()
у
объекта
нашего
документа,
он
будет
записан
без
участия
формы
документа.
Это
значит,
что
событие
ПередЗаписью
формы
документа
вызвано
не
будет
и
наш
код
обработчика
не
сработает.
Чтобы
предусмотреть
возможность
синхронизации
периода
движений
документа
с
датой
документа
и
в
случае
программной
записи
объекта
Документ,
следует
использовать
обработчик
события
ПередЗаписью
объекта
Документ,
а
не
формы
документа.
Событие
ПередЗаписью
в
случае
интерактивной
записи
документа
сначала
будет
вызвано
у
формы
документа,
а
затем
у
объекта
Документ.
В
режиме
Конфигуратор
Вернемся
в
конфигуратор
и
удалим
из
модуля
формы
добавленный
нами
текст
и
создадим
обработчик
события
ПередЗаписью
в
модуле
документа
ВводНачальныхОстатковНоменклатуры.
Для
этого
откроем
на
закладке
Прочее
окна
редактирования
этого
объекта
модуль
объекта
и
внесем
в
него
следующий
текст.
Процедура
ПередЗаписью(Отказ,
РежимЗаписи,
РежимПроведения)
//
Определить,
нужно
ли
обновлять
дату
в
движениях
ОбновитьДатуДвижений
=
ЭтоНовый()
Или
Движения.ОстаткиМатериалов.Модифицированность();
Если
Не
ОбновитьДатуДвижений
Тогда
//
Проверить,
что
дата
изменилась
Запрос
=
Новый
Запрос;
Запрос.УстановитьПараметр(«ТекущийДокумент»,
Ссылка);
Запрос.Текст
=
«ВЫБРАТЬ
|
Дата
|ИЗ
|
Документ.ВводНачальныхОстатковНоменклатуры
|ГДЕ
Ссылка
=
&ТекущийДокумент»;
Выборка
=
Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ОбновитьДатуДвижений
=
Выборка.Дата
<>
Дата;
КонецЕсли;
//
Установить
всем
новую
дату,
если
нужно
Если
ОбновитьДатуДвижений
Тогда
Если
Не
Движения.ОстаткиМатериалов.Выбран()
И
Не
Движения.ОстаткиМатериалов.Модифицированность()
Тогда
Движения.ОстаткиМатериалов.Прочитать();
КонецЕсли;
Для
Каждого
ЗаписьРегистра
Из
Движения.ОстаткиМатериалов
Цикл
ЗаписьРегистра.Период
=
Дата;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Как
вы
видите,
в
этом
случае
обработчик
содержит
больше
кода
за
счет
дополнительных
проверок,
которые
выполняются
в
результате
возможности
как
интерактивной,
так
и
программной
записи
объекта.
Поясним
содержание
обработчика.
Если
записывается
новый
документ
или
были
изменены
его
движения,
следует
обновить
дату
движений.
В
противном
случае
мы
считваем
запросом
дату
документа
из
базы
и
сравниваем
ее
с
датой,
установленной
у
записываемого
объекта.
Если
даты
разные,
также
следует
обновить
дату
движений.
Перед
установкой
даты
мы
проверяем,
был
ли
прочитан
набор
записей
в
свойстве
Движения
объекта
и
изменился
ли
он.
Если
оба
этих
условия
ложны,
значит
набор
записей
в
свойстве
Движения
объекта
пуст,
и
это
состояние
не
связано
с
его
изменением.
В
этом
случае,
чтобы
предотвратить
ошибочное
удаление
записей
в
регистре
(перезаписать
пустым
набором
записей),
мы
предварительно
читаем
движения
из
регистра
в
набор
записей
в
свойстве
Движения.
Затем,
как
и
в
предыдущем
случае,
устанавливаем
нужную
дату
для
всех
записей
этого
набора.
При
выполнении
записи
объекта
документ
этот
набор
будет
записан
в
регистр
накопления.
В
режиме
1С:Предприятие
Запустим
режим
отладки
и
убедимся,
что
указав
новую
дату
для
нашего
документа
и
записав
его,
мы
получим
движения
в
регистре
накопления
с
новой
датой.
В
процессе
записи
нашего
документа
можно
управлять
не
только
периодом
записей
регистра
накопления,
но
и
значениями
других
полей
регистра.
Например,
по
аналогичному
принципу
может
быть
создан
документ
Операция,
позволяющий
вводить
ручные
операции
в
регистр
бухгалтерии.
При
этом
вероятно,
что
кроме
управления
периодом
записей
регистра
вам
потребуется
управлять
значением
поля
Активность
(включать
и
выключать
проводки
документа)
и
т.д.
Где
создавать
обработчики
событий
Выбор
обработчика,
в
который
будет
помещен
текст
процедуры,
зависит
от
логики
работы
создаваемого
объекта.
Если
конфигурация
не
предусматривает
прогаммной
записи
объекта,
можно
выбрать
обработчик
модуля
формы.
Если
предполагается
и
программная
модификация
объекта,
следует
выбирать
обработчик
модуля
объекта.
Заметьте,
что
оба
этих
способа
не
исключают
модификацию
записей
регистра
через
объект
Регистр<…>НаборЗаписей.<имя
регистра>.
Поэтому
если
логика
конфигурации
подразумевает
возможность
программной
модификации
объекта
НаборЗаписей,
код
обработки
следует
помещать
в
обработчик
события
набора
записей.
Все
попытки
изменить
данные
регистра
будут
сведены
к
записи
именно
набора
записей.
Контрольные
вопросы
Для
чего
предназначен
документ
для
ввода
начальных
остатков
и
как
его
создать.
Как
программно
изменить
значение
регистра
при
вводе
начальных
остатков.
В
каких
случаях
использовать
модуль
формы,
а
в
каких
–
модуль
объекта
для
размещения
обработчиков
событий.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Анализируем вид регистра для выбора варианта редактирования записей
Регистры сведений по режиму записи подразделяются на независимые регистры и регистры с подчинением регистратору. Программная работа с этими регистрами имеет различия, поэтому вначале определите какой регистр Вам нужно изменить. Для этого откройте свойства регистра сведений и определите его режим записи:
Дополнительно обратите внимание на периодичность регистра сведений — если регистр периодический, все данные в нем записываются в разрезе по периоду. Более подробно этот момент мы рассмотрим ниже на примерах.
После того, как Вы определились с режимом записи изменяемого регистра сведений, Вы можете выбрать вариант изменения записей регистра.
Изменяем записи в независимом регистре сведений
Давайте рассмотрим пример изменения записей в регистре сведений КурсыВалют. Ниже показаны свойства этого регистра (сразу обращайте внимание на состав измерений регистра, режим записи и периодичность):
К примеру, нам необходимо перезаписать курс валюты. В первом варианте мы установим курс валюты без анализа уже записанных данных:
Процедура УстановитьКурсВалюты(Период, Валюта, Курс, Кратность)
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = Период;
Запись.Валюта = Валюта;
Запись.Курс = Курс;
Запись.Кратность = Кратность;
Запись.Записать();
КонецПроцедуры
Т.к. регистр сведений у нас периодический — дополнительно мы указываем период для курса валюты.
Теперь, используя объект МенеджерЗаписи, мы перезапишем только курс валюты. Для этого сперва установим отбор по периоду и валюте и прочитаем данные из регистра сведений:
Процедура УстановитьКурсВалюты(Период, Валюта, Курс)
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = Период;
Запись.Валюта = Валюта;
Запись.Прочитать();
Если Запись.Выбран() Тогда
Запись.Курс = Курс;
Запись.Записать();
КонецЕсли;
КонецПроцедуры
С помощью функции Выбран() мы проверяем, считана запись или нет. Если запись существует (по установленному периоду и валюте) — мы устанавливаем новый курс. В этом варианте уже не нужно устанавливать кратность т.к. ее значение не изменится и будет записано старое значение.
А теперь давайте выполним аналогичные действия с использованием объекта НаборЗаписей для изменения данных в регистре сведений:
Процедура УстановитьКурсВалюты(Период, Валюта, Курс)
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Период);
Набор.Отбор.Валюта.Установить(Валюта);
Набор.Прочитать();
Если Набор.Количество() Тогда
Запись = Набор[0];
Запись.Курс = Курс;
Набор.Записать();
КонецЕсли;
КонецПроцедуры
В примере выше мы создаем набор записей и устанавливаем для него отбор по измерениям и периоду. После установки отбора считываем записи. В результате в наборе будут ранее записанные записи. Т.к. мы установили полный отбор по измерениям (периоду и валюте) — максимальное количество записей в отборе равно 1. Поэтому мы проверяем набор на количество и если запись есть — устанавливаем новый курс валюты.
Все примеры, описанные выше, выполнят одинаковые действия по установке нового курса валют. Выбирайте вариант, который Вам более удобен и понятен.
Изменяем записи в регистре с подчинением регистратору
В отличие от независимого регистра сведений, все записи в таком регистре подчиненны конкретному регистратору. Поэтому для редактирования записей Вам нужно установить отбор по регистратору и прочитать данные. После этого можно изменять запись в регистре. Давайте выполним эти действия на примерах.
В качестве примера будем использовать регистр сведений ЦеныНоменклатуры. Ниже показаны свойства этого регистра:
В примере ниже мы будем увеличивать оптовую цену номенклатуры в записях по одному заданному регистратору:
Процедура УвеличитьЦенуНоменклатуры(Регистратор, Номенклатура, ВидЦеныОптовая)
Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Регистратор);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Если Запись.Номенклатура = Номенклатура И Запись.ВидЦены = ВидЦеныОптовая Тогда
Запись.Цена = Запись.Цена * 1.3;
КонецЕсли;
КонецЦикла;
Если Набор.Модифицированность() Тогда
Набор.Записать();
КонецЕсли;
КонецПроцедуры
Вначале мы устанавливаем отбор по регистратору. После указания отбора считываем записи по этому регистратору и в обходе набора записей ищем записи по определенной номенклатуре и с оптовым видом цен. Если цена хоть в одной записи будет изменена — набор будет модифицирован. Таким образом мы будем записывать только изменившиеся данные.
А теперь увеличим все оптовые цены без указания конкретного регистратора. Для этого будем использовать запрос, чтобы определить все регистраторы, по которым есть нужные нам записи в регистре сведений:
Процедура УвеличитьЦенуНоменклатуры(Номенклатура, ВидЦеныОптовая)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ЦеныНоменклатуры.Регистратор КАК Регистратор
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
|ГДЕ
| ЦеныНоменклатуры.Номенклатура = &Номенклатура
| И ЦеныНоменклатуры.ВидЦены = &ВидЦеныОптовая");
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("ВидЦеныОптовая", ВидЦеныОптовая);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Если Запись.Номенклатура = Номенклатура И Запись.ВидЦены = ВидЦеныОптовая Тогда
Запись.Цена = Запись.Цена * 1.3;
КонецЕсли;
КонецЦикла;
Если Набор.Модифицированность() Тогда
Набор.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если сравните этот пример с первым — изменилось только определение регистратора. Если первый пример изменял данные только в одном регистраторе — последний пример изменит записи по всем регистраторам в регистре сведений.
На этих небольших примерах мы рассмотрели основные особенности изменения отдельных записей в регистрах сведений. Каждый регистр требует своего особенного подхода — но если Вы поймете общую последовательность действий по изменению регистра сведений, сложностей по работе с регистрами у Вас не будет.
В дополнение приводим пример работы с нашей обработкой по изменению записей в произвольных регистрах сведений, скачать которую Вы можете по этой ссылке.
Наши разработки:
Документ «Корректировка записей регистров» в типовых конфигурациях 1С предназначен для ручной корректировки записей регистров накопления, зависимых регистров сведений и регистров бухгалтерии. Типичные ситуации, в которых может понадобиться документ «Корректировка записей регистров», — ввод начальных остатков, исправление ошибок в учете, отражение в учете операций, для которых в конфигурации нет специальных документов. В документе есть сервис автоматического заполнения движений с предопределенным действием «Сторно движений документа». С его помощь можно автоматически создать движения по регистрам бухгалтерии и регистрам накопления, аналогичные движениям указанного документа, но с отрицательными значениями.
Иногда количество вводимых записей по регистрам может быть велико и тогда целесообразно выполнить корректировку регистров программно. Документ «Корректировка записей регистров», как Вы уже, наверно, догадались, не совсем обычный. А иначе бы о нем не стоило и писать.
В качестве примера, когда может потребоваться программно создать документ «Корректировка записей регистров», предлагаю рассмотреть операцию переоценки основных средств. Переоценка основных средств — ситуация хоть и нечастая, но все же вполне реальная, а специального документа для переоценки в типовых конфигурациях 1С нет. Чтобы пример получился более представительным (включал в себя все виды корректируемых регистров), я сделал обработку для конфигурации «1С:Управление производственным предприятием». Но с другой стороны, чтобы не перегружать пример лишней информацией, мы рассмотрим случай, когда в результате переоценки происходит увеличение стоимости основных средств и накопленной амортизации (дооценка).
В этом случае переоценка основных средств отражается в бухгалтерском учете проводками:
* Дт. 01.01. — Кт. 83.01 — Увеличение первоначальной стоимости ОС.
* Дт. 83.01. — Кт. 02.01 — Увеличение суммы накопленной амортизации ОС.
В налоговом учете операция переоценки основных средств не предусмотрена, но для того чтобы соблюдалось равенство БУ = НУ + ПР + ВР, мы должны отразить в учете возникновение постоянных разниц. Также мы должны сделать движения в регистрах накопления «СтоимостьОС», «СтоимостьОСБухгалтерскийУчет» и в регистрах сведений «ПараметрыАмортизацииОС», «ПараметрыАмортизацииОСБухгалтерскийУчет», «СобытияОС» и «СобытияОСОрганизаций».
Исходные данные для переоценки ОС берутся из dbf-таблицы с набором полей:
* OS (строка) — код основного средства;
* SumU (число) — сумма дооценки по управленческому учету в единицах валюты управленческого учета;
* SumB (число) — сумма дооценки по бухгалтерскому учету;
* AmortU (число) — сумма дооценки накопленной амортизации по управленческому учету в единицах валюты управленческого учета;
* AmortB (число) — сумма дооценки накопленной амортизации по бухгалтерскому учету.
Упрощенный фрагмент кода обработки, иллюстрирующий запись проводок в регистр бухгалтерии, представлен в листинге:
Код 1C v 8.х
Сч01_01 = ПланыСчетов.Хозрасчетный.ОСвОрганизации;
Сч02_01 = ПланыСчетов.Хозрасчетный.АмортизацияОС_01;
Сч83_01 = ПланыСчетов.Хозрасчетный.ПриростСтоимостиИмуществаПоПереоценке;
ДБФ = Новый XBase;
ДБФ.ОткрытьФайл(ИмяФайла);
Если ДБФ.Открыта() Тогда
Попытка
НачатьТранзакцию();
ДокКорректировка = Документы.КорректировкаЗаписейРегистров.СоздатьДокумент();
ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ДокКорректировка.ЭтотОбъект, ПараметрыСеанса.ТекущийПользователь);
ДокКорректировка.Дата = Период;
НоваяСтрокаРегБух = ДокКорректировка.ТаблицаРегистровБухгалтерии.Добавить();
НоваяСтрокаРегБух.Имя = "Хозрасчетный";
НоваяСтрокаРегБух.Представление = "Журнал проводок (бухгалтерский учет)";
ДокКорректировка.Записать();
ДокКорректировкаСсылка = ДокКорректировка.Ссылка;
НЗХозрасчетный = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НЗХозрасчетный.Отбор.Регистратор.Значение = ДокКорректировкаСсылка;
ДБФ.Первая();
Пока Не ДБФ.ВКонце() Цикл
ОсновноеСредство = Справочники.ОсновныеСредства.НайтиПоКоду(СокрЛП(ДБФ.OS));
Если ОсновноеСредство.Пустая() Тогда
Сообщить("Не найдено ОС с кодом " + ДБФ.OS + "!", СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
ЗХозрасчетный = НЗХозрасчетный.Добавить();
ЗХозрасчетный.Период = Период;
ЗХозрасчетный.Регистратор = ДокКорректировкаСсылка;
ЗХозрасчетный.Организация = Организация;
ЗХозрасчетный.Содержание = "Увеличение первоначальной стоимости ОС";
ЗХозрасчетный.СчетДт = Сч01_01;
ЗХозрасчетный.СчетКт = Сч83_01;
БухгалтерскийУчет.УстановитьСубконто(ЗХозрасчетный.СчетДт, ЗХозрасчетный.СубконтоДт, "ОсновныеСредства", ОсновноеСредство);
БухгалтерскийУчет.УстановитьСубконто(ЗХозрасчетный.СчетКт, ЗХозрасчетный.СубконтоКт, "ОсновныеСредства", ОсновноеСредство);
ЗХозрасчетный.Сумма = ДБФ.SumB;
ЗХозрасчетный = НЗХозрасчетный.Добавить();
ЗХозрасчетный.Период = Период;
ЗХозрасчетный.Регистратор = ДокКорректировкаСсылка;
ЗХозрасчетный.Организация = Организация;
ЗХозрасчетный.Содержание = "Увеличение накопленной амортизации ОС";
ЗХозрасчетный.СчетДт = Сч83_01;
ЗХозрасчетный.СчетКт = Сч02_01;
БухгалтерскийУчет.УстановитьСубконто(ЗХозрасчетный.СчетДт, ЗХозрасчетный.СубконтоДт, "ОсновныеСредства", ОсновноеСредство);
БухгалтерскийУчет.УстановитьСубконто(ЗХозрасчетный.СчетКт, ЗХозрасчетный.СубконтоКт, "ОсновныеСредства", ОсновноеСредство);
ЗХозрасчетный.Сумма = ДБФ.AmortB;
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
НЗХозрасчетный.Записать();
ЗафиксироватьТранзакцию();
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
ОтменитьТранзакцию();
КонецПопытки;
КонецЕсли;
Как видно из примера, документ «Корректировка записей регистров» используется в качестве регистратора, движения же записываются непосредственно в регистр. Движения по регистрам накопления и регистрам сведений делаются аналогично.
Смотрите так же: Корректировка регистров накопления через документ
Источник
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
/// Как прочитать бухгалтерские проводки без значений /// субконто в 1с 8.3, 8.2 &НаСервере Процедура КакПрочитатьПроводкиБезСубконтоНаСервере() // За журнал проводок отвечает таблица РегистрБухгалтерии.Хозрасчетный. // Обратите внимание, что в ней нет информации о субконто - аналитике // счетов, участвующих в проводках. // получим все бухгалтерские проводки Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Хозрасчетный.Период КАК Период, | Хозрасчетный.Организация, | Хозрасчетный.СчетДт, | Хозрасчетный.СчетКт, | Хозрасчетный.КоличествоДт, | Хозрасчетный.КоличествоКт, | Хозрасчетный.Сумма |ИЗ | РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный |ГДЕ | Хозрасчетный.Активность = Истина |УПОРЯДОЧИТЬ ПО | Период"; РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "[" + Формат(Записи.Период, "ДФ=dd.MM.yy") + "] " + "Дт " + Записи.СчетДт + " " + "Кт " + Записи.СчетКт + " " + Записи.Сумма + " руб."); КонецЦикла; КонецПроцедуры /// Как прочитать бухгалтерские проводки вместе со /// значениями субконто в 1с 8.3, 8.2 &НаСервере Процедура КакПрочитатьПроводкиВместеССубконтоНаСервере() // За получение бухгалтерских проводок вместе с их аналитикой (субконто) // отвечает виртуальная таблица ДвиженияССубконто, // у неё есть параметры: // 1. Начало периода // 2. Конец периода // 3. Условие // 4. Порядок (влияет только на отбор первых) // 5. Первые (отбор перых N записей) // Получим проводки за 1 квартал 2014 года, где счёт 41.01 в // дебете или кредите, вместе с их аналитикой (субконто). Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйДвиженияССубконто.Период КАК Период, | ХозрасчетныйДвиженияССубконто.Организация, | ХозрасчетныйДвиженияССубконто.Регистратор, | ХозрасчетныйДвиженияССубконто.Активность, | ХозрасчетныйДвиженияССубконто.СчетДт, | ХозрасчетныйДвиженияССубконто.СубконтоДт1, | ХозрасчетныйДвиженияССубконто.СубконтоДт2, | ХозрасчетныйДвиженияССубконто.СубконтоДт3, | ХозрасчетныйДвиженияССубконто.СчетКт, | ХозрасчетныйДвиженияССубконто.СубконтоКт1, | ХозрасчетныйДвиженияССубконто.СубконтоКт2, | ХозрасчетныйДвиженияССубконто.СубконтоКт3, | ХозрасчетныйДвиженияССубконто.Сумма, | ХозрасчетныйДвиженияССубконто.КоличествоДт, | ХозрасчетныйДвиженияССубконто.КоличествоКт |ИЗ | РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто( | ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00), | ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59), | Активность = Истина И ( | СчетДт = &ВыбСчет ИЛИ СчетКт = &ВыбСчет) | ) | КАК ХозрасчетныйДвиженияССубконто |УПОРЯДОЧИТЬ ПО | Период Возр"; Запрос.УстановитьПараметр("ВыбСчет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01")); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "[" + Формат(Записи.Период, "ДФ=dd.MM.yy") + "] " + "Дт " + Записи.СчетДт + " " + "(" + Записи.СубконтоДт1 + ", " + Записи.СубконтоДт2 + ")" + " " + "Кт " + Записи.СчетКт + " " + "(" + Записи.СубконтоКт1 + ", " + Записи.СубконтоКт2 + ")" + " " + Записи.Сумма + " руб."); КонецЦикла; КонецПроцедуры /// Как получить обороты между бухгалтерскими счетами в 1с 8.3, 8.2 &НаСервере Процедура КакПолучитьОборотыМеждуСчетамиНаСервере() // Пример №1 Сообщить("Пример №1"); // За получение оборотов между счётом и корреспондирующим счётом // за произвольный период с заданной периодичностью в различных // разрезах аналитики отвечает виртуальная таблица Обороты, // у неё есть следующие параметры: // 1. Начало периода // 2. Конец периода // 3. Периодичность (например, Период, Запись, Год, Месяц...) // 4. Условие счета (например, Счет = &ВыбСчет) // 5. Субконто (список видов субконто, влияет на доступность // и смысл Субконто1, Субконто2.., которыми можно оперировать // в запросе). // 6. Условие (например, Субконто1 = &ВыбСклад) // 7. Условие корсчета (аналогично условию счёта) // 8. КорСубконто (аналогично субконто) // Узнаем сколько пришло и сколько ушло товара на основной склад // за январь 2014 года. То есть получим дебетовые и кредитовые // обороты по счёту 41.01, субконто Склады (значение "Основной склад") Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОбороты.Счет, | ХозрасчетныйОбороты.Субконто1 КАК Склад, | ХозрасчетныйОбороты.Организация, | ХозрасчетныйОбороты.СуммаОборотДт КАК ПришёлТовар, | ХозрасчетныйОбороты.СуммаОборотКт КАК УшёлТовар, | ХозрасчетныйОбороты.СуммаОборот КАК Разница |ИЗ | РегистрБухгалтерии.Хозрасчетный.Обороты( | ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00), | ДАТАВРЕМЯ(2014, 01, 31, 23, 59, 59), | Период, | Счет = &ВыбСчет, | &ВидыСубконто, | Субконто1 = &ВыбСклад | ) |КАК ХозрасчетныйОбороты"; Запрос.УстановитьПараметр("ВыбСчет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01") ); ВидыСубконто = Новый Массив; ВидыСубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады ); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("ВыбСклад", Справочники.Склады.НайтиПоНаименованию("Основной") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Если Записи.Следующий() Тогда Сообщить("Счёт " + Записи.Счет + " (" + Записи.Склад + ")"); Сообщить("Пришёл товар на " + Записи.ПришёлТовар + " руб."); Сообщить("Ушёл товар на " +Записи.УшёлТовар + " руб."); Сообщить("Разница между поступление и списанием " + Записи.Разница + " руб." ); КонецЕсли; // =========================================================== // Пример №2 Сообщить("Пример №2"); // Узнаем сколько пришло товара на основной склад // за каждый месяц 2014 года. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОбороты.Период, | ХозрасчетныйОбороты.Счет, | ХозрасчетныйОбороты.Субконто1 КАК Склад, | ХозрасчетныйОбороты.Организация, | ХозрасчетныйОбороты.СуммаОборотДт КАК ПришёлТовар |ИЗ | РегистрБухгалтерии.Хозрасчетный.Обороты( | ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00), | ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59), | Месяц, | Счет = &ВыбСчет, | &ВидыСубконто, | Субконто1 = &ВыбСклад | ) КАК ХозрасчетныйОбороты |УПОРЯДОЧИТЬ ПО | Период Возр"; Запрос.УстановитьПараметр("ВыбСчет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01") ); ВидыСубконто = Новый Массив; ВидыСубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады ); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("ВыбСклад", Справочники.Склады.НайтиПоНаименованию("Основной") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( Формат(Записи.Период, "ДФ=ММММ") + ": " + Записи.ПришёлТовар + " руб." ); КонецЦикла; // =========================================================== // Пример №3 Сообщить("Пример №3"); // Узнаем сколько денег поступило в кассу от покупателей за 2014 год. // То есть проанализируем дебетовые обороты между 50.01 и 62.01 Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОбороты.Счет, | ХозрасчетныйОбороты.КорСчет, | ХозрасчетныйОбороты.СуммаОборотДт |ИЗ | РегистрБухгалтерии.Хозрасчетный.Обороты( | ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00), | ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59), | Период, | Счет = &ВыбСчет, | , | , | КорСчет = &ВыбКорСчет | ) КАК ХозрасчетныйОбороты"; Запрос.УстановитьПараметр("ВыбСчет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("50.01") ); Запрос.УстановитьПараметр("ВыбКорСчет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "За 2014 год на " + Записи.Счет + " с " + Записи.КорСчет + " пришло " + Записи.СуммаОборотДт + " руб." ); КонецЦикла; КонецПроцедуры /// Как получить остатки по бухгалтерскому счету в 1с 8.3, 8.2 &НаСервере Процедура КакПолучитьОстаткиПоСчетуНаСервере() // За получение остатков по бухгалтерским счетам // в разрезе аналитики отвечает виртуальная // таблица Остатки, у неё есть следующие параметры: // 1. Период (на который считаем остатки) // 2. Условие счета (например, Счет = &ВыбСчет) // 3. Субконто (список видов субконто, влияет на доступность // и смысл Субконто1, Субконто2.., которыми можно оперировать // в запросе // 4. Условие (например, Субконто1 = &ВыбСклад) // Найдём остатки товаров на всех складах на конец 2014 года. // То есть запросим дебетовые остатки по всем счетам, // входящих в группу 41 счёта в разрезе субконто Номенклатура. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОстатки.Счет, | ХозрасчетныйОстатки.Субконто1 КАК Товар, | ХозрасчетныйОстатки.КоличествоОстатокДт, | ХозрасчетныйОстатки.СуммаОстатокДт |ИЗ | РегистрБухгалтерии.Хозрасчетный.Остатки( | ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59), | Счет В ИЕРАРХИИ (&ВыбСчет), &ВидыСубконто | ) КАК ХозрасчетныйОстатки"; Запрос.УстановитьПараметр("ВыбСчет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("41") ); ВидыСубконто = Новый Массив; ВидыСубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура ); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Сообщить("Остатки товаров по всем складам на конец 2014 года."); Пока Записи.Следующий() Цикл Сообщить( Записи.Товар.Наименование + " Количество [" + Записи.КоличествоОстатокДт + " шт.]" + " Сумма [" + Записи.СуммаОстатокДт + " руб.]" ); КонецЦикла; КонецПроцедуры /// Как получить сразу остатки и обороты по бухгалтерскому счету /// в 1с 8.3, 8.2 &НаСервере Процедура КакПолучитьСразуОстаткиИОборотыПоСчетуНаСервере() // За получение остатков и обротов за произвольный период // с заданной периодичностью в разрезе аналитики отвечает // виртуальная таблица ОстаткиИОбороты, у неё есть параметры: // 1. Начало периода // 2. Конец периода // 3. Периодичность (например, Период, Год, Месяц...) // 4. Метод дополнения периодов (Движение или ДвиженияИГраницыПериода) // 5. Условие счета (например, Счет = &ВыбСчет) // 6. Субконто (список видов субконто, влияет на доступность // и смысл Субконто1, Субконто2.., которыми можно оперировать // в запросе // 7. Условие (например, Субконто1 = &ВыбТовар) // Для примера получим начальный остаток, приход, расход, и // конечный остаток банана на всех складах за каждый месяц // 2014 года. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОстаткиИОбороты.Период, | ХозрасчетныйОстаткиИОбороты.Счет, | ХозрасчетныйОстаткиИОбороты.Субконто1, | ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстатокДт, | ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт, | ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт, | ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстатокДт |ИЗ | РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты( | ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00), | ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59), | Месяц, ДвиженияИГраницыПериода, | Счет В ИЕРАРХИИ (&ВыбСчет), &ВидыСубконто, | Субконто1 = &ВыбТовар | ) КАК ХозрасчетныйОстаткиИОбороты"; Запрос.УстановитьПараметр("ВыбСчет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("41") ); ВидыСубконто = Новый Массив; ВидыСубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура ); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("ВыбТовар", Справочники.Номенклатура.НайтиПоНаименованию("Банан") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить(Формат(Записи.Период, "ДФ=ММММ") + ": "); Сообщить( Строка(Записи.Счет) + " " + Записи.Субконто1 + " " + "Нач. остаток " + Записи.КоличествоНачальныйОстатокДт + " приход " + Записи.КоличествоОборотДт + ", расход " + Записи.КоличествоОборотКт + " Кон. остаток " + Записи.КоличествоКонечныйОстатокДт ); КонецЦикла; КонецПроцедуры /// Как найти и изменить программно бухгалтерские проводки /// документа в 1с 8.3, 8.2 &НаСервере Процедура КакНайтиИИзменитьПроводкиДокументаНаСервере() // предположим у нас есть ссылка на проведенный // документ поступления еды № ВМБП-000002 ПоступлениеСсылка = Документы.ПоступлениеЕды.НайтиПоНомеру( "ВМБП-000002", '20141231'); // мы знаем, что этот документ делает следующие // проводки по регистру бухгалтерии "Хозрасчетный": // - Дт 41.01 Кт 60.01 // - Дт 60.01 Кт 50.01 // наша задача: найти эти проводки бухгалтерские проводки // и изменить их (например, удвоим количество по дебету 41.01) // и записать вместо старых // используем объектную технику получения проводок, // ведь мы будем их изменять Поступление = ПоступлениеСсылка.ПолучитьОбъект(); // получим набор проводок этого документа в регистр "Хозрасчетный" НаборПроводок = Поступление.Движения.Хозрасчетный; // прочитаем проводки из базы данных НаборПроводок.Прочитать(); Для Каждого Проводка Из НаборПроводок Цикл // выведем старые значения Сообщить( "Дт " + Проводка.СчетДт + " (" + Проводка.КоличествоДт + " шт.) " + "Кт " + Проводка.СчетКт + " (" + Проводка.КоличествоКт + " шт.) " + Проводка.Сумма + " руб." ); Если Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01") Тогда // эта проводка в дебет 41 счёта // изменим её, удвоив количество по дебету Проводка.КоличествоДт = Проводка.КоличествоДт * 2; КонецЕсли; КонецЦикла; // добавим новую проводку НоваяПроводка = НаборПроводок.Добавить(); // дт НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01"); НоваяПроводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = Справочники.Склады.НайтиПоНаименованию("Основной"); НоваяПроводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = Справочники.Номенклатура.НайтиПоНаименованию("Банан"); НоваяПроводка.КоличествоДт = 333; // кт НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01"); НоваяПроводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = Справочники.Контрагенты.НайтиПоНаименованию("ООО ""Африка"""); // общая часть НоваяПроводка.Период = ТекущаяДата(); НоваяПроводка.Организация = Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка"""); НоваяПроводка.Сумма = 5000; НоваяПроводка.Содержание = "Проводка добавлена программно."; // разом запишем набор проводок НаборПроводок.Записать( Истина // удалим старые проводки и запишем вместо них новые ); // теперь бухгалтерские проводки документа № ВМБП-000002, // отличаются от тех, что были записаны документом при проведении // чтобы вернуть их к начальному виду - нужно // перепровести документ КонецПроцедуры /// Как прочитать бухгалтерские проводки документа запросом в 1с 8.3, 8.2 &НаСервере Процедура КакПрочитатьПроводкиДокументаЗапросомНаСервере() // этот приём используется, если не требуется изменять // найденные проводки // предположим у нас есть ссылка на проведенный // документ поступления еды № ВМБП-000002 ПоступлениеСсылка = Документы.ПоступлениеЕды.НайтиПоНомеру( "ВМБП-000002", '20141231'); // мы знаем, что этот документ делает проводки по // регистру бухгалтерии "Хозрасчетный" // прочитаем проводкипо регистру "Хозрасчетный" запросом Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Хозрасчетный.СчетДт, | Хозрасчетный.СчетКт, | Хозрасчетный.Сумма |ИЗ | РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный |ГДЕ | Хозрасчетный.Регистратор = &ВыбРегистратор | |УПОРЯДОЧИТЬ ПО | Хозрасчетный.НомерСтроки"; Запрос.УстановитьПараметр("ВыбРегистратор", ПоступлениеСсылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщить( "Дт " + ВыборкаДетальныеЗаписи.СчетДт + " Кт " + ВыборкаДетальныеЗаписи.СчетКт + " " + ВыборкаДетальныеЗаписи.Сумма + " руб." ); КонецЦикла; КонецПроцедуры /// Как создать бухгалтерские проводки без привязки /// к документу в 1с 8.3, 8.2 &НаСервере Процедура КакСоздатьПроводкиБезДокументаНаСервере() // в нашей тестовой конфигурации нет документа // "ОперацияБух", который присутствует во всех // типовых Сообщить("Этот пример нельзя выполнить в этой базе."); Возврат; // бухгалтерские проводки обязательно должны быть к // привязаны к документу, в данном случае этим документом // будет документ "ОперацияБух", задуманный как раз для // ручных бухгалтерских операций // создаём и записываем пустой документ // пока без бухгалтерских проводок Операция = Документы.ОперацияБух.СоздатьДокумент(); Операция.Дата = ТекущаяДата(); Операция.Организация = Справочники.Организации.НайтиПоНаименованию("Ромашка"); Операция.СуммаОперации = 1000; Операция.Содержание = "Ручная операция по 41 счёту"; Операция.Записать(РежимЗаписиДокумента.Запись); // затем получаем его набор проводок (пустой) // заполняем его и записываем НаборПроводок = Операция.Движения.Хозрасчетный; Проводка = НаборПроводок.Добавить(); Проводка.Период = Операция.Дата; Проводка.Организация = Операция.Организация; // дт Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01"); Проводка.СубконтоДт[ ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура ] = Справочники.Номенклатура.НайтиПоНаименованию("Банан"); На41ВедетсяУчетПоСкладам = Проводка.СчетДт.ВидыСубконто.Найти( ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады ) <> Неопределено; Если На41ВедетсяУчетПоСкладам Тогда Проводка.СубконтоДт[ ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады ] = Справочники.Склады.НайтиПоНаименованию("Основной"); КонецЕсли; Проводка.КоличествоДт = 3; // кт Проводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01"); Проводка.СубконтоКт[ ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты ] = Справочники.Контрагенты.НайтиПоНаименованию("Беркут"); // общее Проводка.Сумма = 500; НаборПроводок.Записать(Истина); КонецПроцедуры /// Как получить информацию о бухгалтерском счёте /// из плана счетов в 1с 8.3, 8.2 &НаСервере Процедура КакПолучитьИнформациюОСчетеНаСервере() // читаем информацию о счёте из плана счетов // находим счёт по коду Счёт41_1 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01"); // смотрим состав субконто Для Каждого Субконто Из Счёт41_1.ВидыСубконто Цикл Сообщить("Субконто " + Субконто.ВидСубконто.Наименование); Сообщить(" Валютный " + Субконто.Валютный); Сообщить(" Количественный " + Субконто.Количественный); Сообщить(" Суммовой " + Субконто.Суммовой); КонецЦикла; // узнаем, ведётся ли на 41.01 учёт по складам // (другими словами есть ли у этого счёта субконто // склады) Если Счёт41_1.ВидыСубконто.Найти( ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады ) <> Неопределено Тогда Сообщить("На 41.01 ведётся учёт по складам."); Иначе Сообщить("На 41.01 ведётся учёт по складам не ведётся."); КонецЕсли; // узнаем является ли один счёт родителем другого Счёт41 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41"); Если Счёт41_1.ПринадлежитЭлементу(Счёт41) Тогда Сообщить(Счёт41.Код + " является родителем для " + Счёт41_1.Код); КонецЕсли; КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Документ «Корректировка записей регистров» в типовых конфигурациях 1С предназначен для ручной корректировки записей регистров накопления, зависимых регистров сведений и регистров бухгалтерии. Типичные ситуации, в которых может понадобиться документ «Корректировка записей регистров», — ввод начальных остатков, исправление ошибок в учете, отражение в учете операций, для которых в конфигурации нет специальных документов. В документе есть сервис автоматического заполнения движений с предопределенным действием «Сторно движений документа». С его помощь можно автоматически создать движения по регистрам бухгалтерии и регистрам накопления, аналогичные движениям указанного документа, но с отрицательными значениями.
Иногда количество вводимых записей по регистрам может быть велико и тогда целесообразно выполнить корректировку регистров программно. Документ «Корректировка записей регистров», как Вы уже, наверно, догадались, не совсем обычный. А иначе бы о нем не стоило и писать.
В качестве примера, когда может потребоваться программно создать документ «Корректировка записей регистров», предлагаю рассмотреть операцию переоценки основных средств. Переоценка основных средств — ситуация хоть и нечастая, но все же вполне реальная, а специального документа для переоценки в типовых конфигурациях 1С нет. Чтобы пример получился более представительным (включал в себя все виды корректируемых регистров), я сделал обработку для конфигурации «1С:Управление производственным предприятием». Но с другой стороны, чтобы не перегружать пример лишней информацией, мы рассмотрим случай, когда в результате переоценки происходит увеличение стоимости основных средств и накопленной амортизации (дооценка).
В этом случае переоценка основных средств отражается в бухгалтерском учете проводками:
* Дт. 01.01. — Кт. 83.01 — Увеличение первоначальной стоимости ОС.
* Дт. 83.01. — Кт. 02.01 — Увеличение суммы накопленной амортизации ОС.
В налоговом учете операция переоценки основных средств не предусмотрена, но для того чтобы соблюдалось равенство БУ = НУ + ПР + ВР, мы должны отразить в учете возникновение постоянных разниц. Также мы должны сделать движения в регистрах накопления «СтоимостьОС», «СтоимостьОСБухгалтерскийУчет» и в регистрах сведений «ПараметрыАмортизацииОС», «ПараметрыАмортизацииОСБухгалтерскийУчет», «СобытияОС» и «СобытияОСОрганизаций».
Исходные данные для переоценки ОС берутся из dbf-таблицы с набором полей:
* OS (строка) — код основного средства;
* SumU (число) — сумма дооценки по управленческому учету в единицах валюты управленческого учета;
* SumB (число) — сумма дооценки по бухгалтерскому учету;
* AmortU (число) — сумма дооценки накопленной амортизации по управленческому учету в единицах валюты управленческого учета;
* AmortB (число) — сумма дооценки накопленной амортизации по бухгалтерскому учету.
Упрощенный фрагмент кода обработки, иллюстрирующий запись проводок в регистр бухгалтерии, представлен в листинге:
Код 1C v 8.х
Сч01_01 = ПланыСчетов.Хозрасчетный.ОСвОрганизации;
Сч02_01 = ПланыСчетов.Хозрасчетный.АмортизацияОС_01;
Сч83_01 = ПланыСчетов.Хозрасчетный.ПриростСтоимостиИмуществаПоПереоценке;
ДБФ = Новый XBase;
ДБФ.ОткрытьФайл(ИмяФайла);
Если ДБФ.Открыта() Тогда
Попытка
НачатьТранзакцию();
ДокКорректировка = Документы.КорректировкаЗаписейРегистров.СоздатьДокумент();
ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ДокКорректировка.ЭтотОбъект, ПараметрыСеанса.ТекущийПользователь);
ДокКорректировка.Дата = Период;
НоваяСтрокаРегБух = ДокКорректировка.ТаблицаРегистровБухгалтерии.Добавить();
НоваяСтрокаРегБух.Имя = "Хозрасчетный";
НоваяСтрокаРегБух.Представление = "Журнал проводок (бухгалтерский учет)";
ДокКорректировка.Записать();
ДокКорректировкаСсылка = ДокКорректировка.Ссылка;
НЗХозрасчетный = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НЗХозрасчетный.Отбор.Регистратор.Значение = ДокКорректировкаСсылка;
ДБФ.Первая();
Пока Не ДБФ.ВКонце() Цикл
ОсновноеСредство = Справочники.ОсновныеСредства.НайтиПоКоду(СокрЛП(ДБФ.OS));
Если ОсновноеСредство.Пустая() Тогда
Сообщить("Не найдено ОС с кодом " + ДБФ.OS + "!", СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
ЗХозрасчетный = НЗХозрасчетный.Добавить();
ЗХозрасчетный.Период = Период;
ЗХозрасчетный.Регистратор = ДокКорректировкаСсылка;
ЗХозрасчетный.Организация = Организация;
ЗХозрасчетный.Содержание = "Увеличение первоначальной стоимости ОС";
ЗХозрасчетный.СчетДт = Сч01_01;
ЗХозрасчетный.СчетКт = Сч83_01;
БухгалтерскийУчет.УстановитьСубконто(ЗХозрасчетный.СчетДт, ЗХозрасчетный.СубконтоДт, "ОсновныеСредства", ОсновноеСредство);
БухгалтерскийУчет.УстановитьСубконто(ЗХозрасчетный.СчетКт, ЗХозрасчетный.СубконтоКт, "ОсновныеСредства", ОсновноеСредство);
ЗХозрасчетный.Сумма = ДБФ.SumB;
ЗХозрасчетный = НЗХозрасчетный.Добавить();
ЗХозрасчетный.Период = Период;
ЗХозрасчетный.Регистратор = ДокКорректировкаСсылка;
ЗХозрасчетный.Организация = Организация;
ЗХозрасчетный.Содержание = "Увеличение накопленной амортизации ОС";
ЗХозрасчетный.СчетДт = Сч83_01;
ЗХозрасчетный.СчетКт = Сч02_01;
БухгалтерскийУчет.УстановитьСубконто(ЗХозрасчетный.СчетДт, ЗХозрасчетный.СубконтоДт, "ОсновныеСредства", ОсновноеСредство);
БухгалтерскийУчет.УстановитьСубконто(ЗХозрасчетный.СчетКт, ЗХозрасчетный.СубконтоКт, "ОсновныеСредства", ОсновноеСредство);
ЗХозрасчетный.Сумма = ДБФ.AmortB;
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
НЗХозрасчетный.Записать();
ЗафиксироватьТранзакцию();
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
ОтменитьТранзакцию();
КонецПопытки;
КонецЕсли;
Как видно из примера, документ «Корректировка записей регистров» используется в качестве регистратора, движения же записываются непосредственно в регистр. Движения по регистрам накопления и регистрам сведений делаются аналогично.
Смотрите так же: Корректировка регистров накопления через документ
Информация взята с сайта http://helpf.pro
В этой статье мы научимся программным способом изменять независимые регистры сведений.
Более подробно о регистрах сведений, их видах и о многом другом читайте в моей книге «Программировать в 1С за 11 шагов».
Регистры сведений 1С
Периодические регистры сведений 1С
Подчиненные регистры сведений 1С
Для того что бы понять и изучить, принципы программной с регистрами сведений, сделаем небольшую задачу на тестовой конфигурации «Управляемое приложение 1С». Создадим обработку, которая будет менять цены определенного вида у всех товаров на определенную дату.
В конфигурации «Управляемое приложение» цены товаров хранятся в независимом периодическом регистре сведений, который имеет следующие данные
Периодичность этого регистра сведений день.
Создадим внешнюю обработку, которую назовем «ИзменитьЦены», и у которой будет один реквизит ВидЦены (тип СправочникСсылка.ВидыЦен), второй реквизит – Процент (тип число), а третий реквизит – Дата (тип Дата). Создадим команду «Изменить цену», которую разместим в командной панели.
Для команды «Изменить цену» создадим обработчики на сервере и на клиенте, где будем изменять данные регистра сведений ЦеныТоваров.
&НаСервере
Процедура ИзменитьЦенуНаСервере()
РегистрЦены = РегистрыСведений.ЦеныТоваров.СоздатьНаборЗаписей(); //1
РегистрЦены.Отбор.ВидЦен.Установить(ВидЦены); //2
РегистрЦены.Отбор.Период.Установить(НачалоДня(Дата));//3
РегистрЦены.Прочитать(); //4
Для Каждого стрНабора из РегистрЦены Цикл
стрНабора.Цена = стрНабора.Цена*((100 + Процент)/100); //5
КонецЦикла;
РегистрЦены.Записать();//6
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьЦену(Команда)
ИзменитьЦенуНаСервере();
КонецПроцедуры
Разберем код на листинге выше. В строке //1 мы создаем набор записей регистра сведений «ЦеныТоваров» с этим набором мы и будем в дальнейшем осуществлять все операции.
Тот набор записей, который мы получили, в принципе, он весь будет содержать все записи регистра сведений, после того как мы его прочтем, а нам нужно обработать только часть этого набора. Поэтому мы в строках //2 и //3 накладываем отборы на регистр сведений. Имейте в виду, что отбор в регистрах сведений можно устанавливать только на равенство! В строка //4 мы прочитали данные регистра сведений, и теперь можем к объекту РегистрЦены обращаться как к коллекции. Что мы и делаем в цикле ниже – мы обходим коллекцию, и в каждой итерации цикла изменяем цену (строка //5). В строке //6 просто записываем объект РегистрЦены, после этого наши изменения появятся в базе.
Теперь поставим более сложную задачу: нам нужно пересчитать цены за какой-то конкретный период. Например, за весь год. В этом случае мы не можем воспользоваться отбором за весь период.
Если мы попробуем так сделать, то возникнет ошибка «Недопустимый тип сравнения».
Поэтому приходится выдумывать различные методы. Я покажу два из них. В первом мы с помощью запроса получим данные из регистра с отбором по нужному виду цен (это будут все данные), и изменим в поле запроса цены, которые будут входить в заданный период. После этого получим выгрузку из запроса. Создадим набор записей регистра накопления с отбором по нужному виду цен (это обязательно, иначе мы затрем всё остальное), прочитаем этот отбор и загрузим в него нашу выгрузку из запроса. После того как мы запишем регистр, обновятся все записи для данного вида цен, но только у тех, которые входят в период, пересчитается дата. Код данного алгоритма ниже. Период – это реквизит формы с типом СтандартныйПериод.
&НаСервере
Процедура ИзменитьЦенуНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| ЦеныТоваров.Период КАК Период,
| ЦеныТоваров.Товар КАК Товар,
| ЦеныТоваров.ВидЦен КАК ВидЦен,
| ВЫБОР
| КОГДА ЦеныТоваров.Период >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
| И ЦеныТоваров.Период <= КОНЕЦПЕРИОДА(&ДатаКонца, ДЕНЬ)
| ТОГДА ЦеныТоваров.Цена * ((100 + &ПроцентЦены) / 100)
| ИНАЧЕ ЦеныТоваров.Цена
| КОНЕЦ КАК Цена
|ИЗ
| РегистрСведений.ЦеныТоваров КАК ЦеныТоваров
|ГДЕ
| ЦеныТоваров.ВидЦен = &ВидЦен»;
Запрос.УстановитьПараметр(«ДатаНачала»,Период.ДатаНачала);
Запрос.УстановитьПараметр(«ДатаКонца»,Период.ДатаОкончания);
Запрос.УстановитьПараметр(«ВидЦен»,ВидЦены);
Запрос.УстановитьПараметр(«ПроцентЦены»,Процент);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить(«Нет данных в регистре по заданному отбору»);
Возврат;
КонецЕсли;
Выгрузка = Результат.Выгрузить();
РегистрЦены = РегистрыСведений.ЦеныТоваров.СоздатьНаборЗаписей();
РегистрЦены.Отбор.ВидЦен.Установить(ВидЦены);
РегистрЦены.Прочитать();
РегистрЦены.Загрузить(Выгрузка);
РегистрЦены.Записать();
КонецПроцедуры
Замерим производительность этого способа.
Второй способ – будем получать записи регистра сведений с отбором по цене, выгружать их в таблицу значений, потом эту таблицу значений изменим (те записи, которые соответствуют нашему периоду), и загрузим обратно в регистр сведений. Код этого способа ниже. Изменять таблицу значений мы будем с помощью запроса.
&НаСервере
Процедура ИзменитьЦенуНаСервере()
РегистрЦены = РегистрыСведений.ЦеныТоваров.СоздатьНаборЗаписей();
РегистрЦены.Отбор.ВидЦен.Установить(ВидЦены);
РегистрЦены.Прочитать();
ТаблицаСРегистра = РегистрЦены.Выгрузить();
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| ТаблицаВыгрузки.Период КАК Период,
| ТаблицаВыгрузки.ВидЦен КАК ВидЦен,
| ТаблицаВыгрузки.Товар КАК Товар,
| ТаблицаВыгрузки.Цена КАК Цена
|ПОМЕСТИТЬ втТаблица
|ИЗ
| &ТаблицаВыгрузки КАК ТаблицаВыгрузки
|
|ИНДЕКСИРОВАТЬ ПО
| ВидЦен,
| Товар
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втТаблица.Период КАК Период,
| втТаблица.ВидЦен КАК ВидЦен,
| втТаблица.Товар КАК Товар,
| ВЫБОР
| КОГДА втТаблица.Период >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
| И втТаблица.Период <= КОНЕЦПЕРИОДА(&ДатаКонца, ДЕНЬ)
| ТОГДА втТаблица.Цена * ((100 + &ПроцентЦены) / 100)
| ИНАЧЕ втТаблица.Цена
| КОНЕЦ КАК Цена
|ИЗ
| втТаблица КАК втТаблица»;
Запрос.УстановитьПараметр(«ДатаНачала»,Период.ДатаНачала);
Запрос.УстановитьПараметр(«ДатаКонца»,Период.ДатаОкончания);
Запрос.УстановитьПараметр(«ТаблицаВыгрузки»,ТаблицаСРегистра);
Запрос.УстановитьПараметр(«ПроцентЦены»,Процент);
Результат = Запрос.Выполнить();
Выгрузка = Результат.Выгрузить();
РегистрЦены.Загрузить(Выгрузка);
РегистрЦены.Записать();
КонецПроцедуры
Подробности об использовании таблиц значений в запросах Вы узнаете в моем курсе «Запрос в 1С: от новичка до профи».
Если брать мои замеры производительности, то первый способ в разы быстрее второго.
Хотя, если честно, то я не соблюдал какую-то особую чистоту эксперимента, поэтому не могу со стопроцентной достоверностью утверждать какой из вышеприведенных способов эффективнее. Решать Вам.
Точно так же при помощи менеджера регистра сведений можно добавлять данные. Поставим задачу: взять все товары с определенным видом цен и увеличить их на нужный процент, но мы не будем редактировать записи, а просто добавим новые на текущую дату.
&НаСервере
Процедура ИзменитьЦенуНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| ЦеныТоваровСрезПоследних.Товар КАК Товар,
| ЦеныТоваровСрезПоследних.Цена * ((100 + &ПроцентЦены) / 100) КАК Цена,
| &ВидЦены КАК ВидЦен,
| НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ) КАК Период
|ИЗ
| РегистрСведений.ЦеныТоваров.СрезПоследних(, ВидЦен = &ВидЦены) КАК ЦеныТоваровСрезПоследних»;
Запрос.УстановитьПараметр(«ВидЦены»,ВидЦены);
Запрос.УстановитьПараметр(«ПроцентЦены»,Процент);
Запрос.УстановитьПараметр(«ТекущаяДата»,ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать();
РегистрЦены = РегистрыСведений.ЦеныТоваров.СоздатьНаборЗаписей();
РегистрЦены.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
РегистрЦены.Прочитать();
РегистрЦены.Очистить();
Пока Выборка.Следующий() Цикл
НоваяЗапись = РегистрЦены.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись,Выборка);
КонецЦикла;
РегистрЦены.Записать();
КонецПроцедуры
В этом коде я при помощи виртуальной таблицы регистра сведений СрезПоследних получаю все товары и цены на текущую дату. Подробно о работе виртуальных таблиц регистров сведений смотрите в моем курсе «Запрос в 1С: от новичка до профи». Потом мы отбираем все записи регистра сведений на текущую дату и очищаем их на всякий случай. А дальше используя функцию Добавить() набора записей регистра, добавляем что нам нужно.
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009