Как найти движения по регистратору 1с

 +2 

   

Распечатать

1С 8.x : Получить движения документа по регистру накоплений

Код 1C v 8.х

 НужныйДокумент = Документы.ПриходнаяНакладная.НайтиПоНомеру(4);
Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();
Движения.Отбор.Регистратор.Значение = НужныйДокумент;
Движения.Прочитать();

Код 1C v 8.х

 НужныйДокумент = Документы.ПриходнаяНакладная.НайтиПоНомеру(4);
Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();
Движения.Отбор.Регистратор.Значение = НужныйДокумент;
Движения.Прочитать();
Для Каждого ОчередноеДвижение Из Движения Цикл
// Алгоритм обработки движений
КонецЦикла;

Если необходимо просто прочитать движения, без последующей модификации, можно воспользоваться запросом к нужному регистру:

Код 1C v 8.х

 // Чтение движений документа с помощью запроса 
      
Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
| *
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткиНоменклатуры
|ГДЕ
| ОстаткиНоменклатуры.Регистратор = &Регистратор";

Запрос.УстановитьПараметр("Регистратор", ПолеВводаРегистратор);

В запросе выбираем все поля (кроме виртуальных) из таблицы регистра РегистрНакопления.ОстаткиНоменклатуры с отбором по регистратору. Значением параметра Регистратор нужно будет установить ссылку на документ.

Если же нужно чтение с последующей модификацией движений, следует воспользоваться объектной моделью представления информации: в свойстве Движения объекта документа обратиться к нужному регистру (в нашем случае это регистр ОстаткиНоменклатуры) и прочитать набор записей регистра.

Код 1C v 8.х

 // Чтение движений документа 
      
НаборЗаписейРегистра = Движения.ОстаткиНоменклатуры;

НаборЗаписейРегистра.Прочитать();

Для Каждого Запись из НаборЗаписейРегистра Цикл

// Чтение и модификация очередного движения.

КонецЦикла;

Если требуется изменить движения документа по всем регистрам, нужно обойти фиксированную коллекцию, содержащуюся в свойстве Движения:

Код 1C v 8.х


Купон на ОЗОН за покупку программ 1С

 // Изменение движений документа 
      
Для Каждого НаборЗаписейРегистра из Движения Цикл
НаборЗаписейРегистра.Прочитать();

Для Каждого Запись из НаборЗаписейРегистра Цикл

// Чтение и модификация очередного движения.

КонецЦикла;

КонецЦикла;

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

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

Информация взята с сайта http://helpf.pro

Если необходимо просто прочитать движения, без последующей модификации, можно воспользоваться запросом к нужному регистру:
Код 1C v 8.х
В запросе выбираем все поля (кроме виртуальных) из таблицы регистра РегистрНакопления.ОстаткиНоменклатуры с отбором по регистратору. Значением параметра Регистратор нужно будет установить ссылку на документ.

Если же нужно чтение с последующей модификацией движений, следует воспользоваться объектной моделью представления информации: в свойстве Движения объекта документа обратиться к нужному регистру (в нашем случае это регистр ОстаткиНоменклатуры) и прочитать набор записей регистра.
Код 1C v 8.х

Если требуется изменить движения документа по всем регистрам, нужно обойти фиксированную коллекцию, содержащуюся в свойстве Движения:
Код 1C v 8.х
Сначала открываем цикл перебора свойств свойства Движения – коллекций наборов записей регистров, для которых наш документ является регистратором.
Далее читаем наборы записей каждой коллекции и открываем цикл перебора записей данного набора записей.

Читайте также:

  1. I. Историко-культурная интерпретация исторического документа
  2. III. Количества осей движения.
  3. III.2 Скорости движения пассажирских поездов
  4. III.3 Скорости движения грузовых поездов
  5. Motor Maid: пионеры женского Байк-движения
  6. NB! Если в течение 1 часа у первородящих отсутствует динамика продвижения головки по родовым путям, то течение родов следует признать неудовлетворительным.
  7. Абревіатури та графічні скорочення у документах
  8. Анализ движения ОС
  9. Анализ движения рабочей силы
  10. Анализ остатков и движения денежной наличности.
  11. Анализ состава, структуры и движения нематериальных активов.
  12. Анализ численности, структуры и движения кадров

И копирование?

Как теперь обрабатывать во встроенном языке ввод на основании

В версии 8.0 при вызове стандартной команды ввода на основании выполняется создание нового объекта и вызов в модуле этого объекта обработчика события «Обработка заполнения».

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

Надо помнить, что событие «Обработка заполнения» возникает не только при вводе на основании. Это событие будет возникать и при вызове метода объекта Заполнить().

Таким образом, обработчик события «Обработка заполнения» является стандартным местом, в котором реализуется заполнение данных объекта из данных объекта основания без учета того, откуда и зачем вызывается это заполнение.

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

Аналогичным образом выполняется копирование. При копировании вызывается обработчик события объекта «При копировании», в котором можно дополнить стандартное заполнение данных выполняемое системой при копировании объекта. Этот обработчик вызывается, как при интерактивном копировании, так и при вызове метода Скопировать().

Кроме того, расширения форм объектов (форма документа, форма элемента справочника и т.д.) предоставляют свойства ПараметрОснованиеи ПараметрОбъектКопирования,которые заполняются системой при выполнении стандартных команд ввода на основании и копирования. Значения этих свойств можно использовать в обработчиках событий формы для определения того, что при открытии формы выполнялся ввод на основании или копирование.

Примеры обработки ввода одних объектов на основании других можно посмотреть в разделах «Ввод на основании» на странице 493 и «Объекты, введенные на основании» на странице 497.

Существует два способа, которыми можно это сделать.

Во-первых, можно «пойти от документа». Для этого следует воспользоваться свойством объекта ДокументОбъект. -Движения.Это свойство содержит коллекцию пустых наборов записей документа по каждому из регистров, которые указаны для

630

этого документа в конфигураторе. Чтобы получить движения документа по конкретному регистру, нужно обратиться к набору записей этого конкретного регистра (указав имя регистра в качестве свойства через точку), и затем прочитать этот набор записей:

ДокументОбъект = Документы.ПриходнаяНакладная.

Движения = ДокументОбъект.Движения.ОстаткиМатериалов; Движения.Прочитать();

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

Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей(); Движения.Отбор.Регистратор.Значение = Документы.ПриходнаяНакладная.

В 7.7 были общие реквизиты. В версии 8.0 их нет?

Да. Было принято решение в версии 8.0 отказаться от общих реквизитов документов. Вместе с этим в версии 8.0 нет и общего журнала документов.

Теперь, если у всех документов нужно иметь аналогичные реквизиты, например, «Автор» и «Редактор», эти реквизиты следует создать вручную у каждого документа.

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

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

Раньше (в 7.7) можно было сделать выбор из списка значений в виде маленького списка или меню, которое подстраивалось по элементу управления формы. А как то же самое сделать в 8.0?

В версии 8.0 для реализации такой возможности следует использовать методы формы (а не списка значений, как это было в 7.7): ВыбратьИзСписка()и ВыбратьИзМеню().

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

Пример вызова: Выбор = ВыбратьИзСпиека(СписокЗначений, ЭлементФормы, НачальноеЗначение);

Таблица (табличный документ)

В 7.7 была процедура НоваяСтраница(). А что в 8.0?

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

Следует заметить, что также появилась возможность вставлять в табличный документ и вертикальные разделители страниц (метод ВывестиВертикальныйРазделительСтраниц()).

Как сохранить табличный документ в формате Excel? У меня ничего не получается.

В версии 8.0 для сохранения табличного документа в формате, отличающемся от его исходного формата, следует использовать пункт меню Файл| Сохранить копию.

Команда меню Файл| Сохранить как. позволяет сохранять табличный документ только в «родном» формате.

Вопросы при переходе с версии 7.7

Запрос

Дата добавления: 2014-11-16 ; Просмотров: 1027 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Алгоритм проведения документа с учетом подписок на события

Если посмотреть свойства документа через палитру свойств, то можно увидеть два важных свойства: “Удаление движений” и “Запись движений при проведении”, причем второе НЕ вынесено на закладку “Движения” окна редактирования документа.

1. Удаление движений.

Если свойство “Удаление движений” уставновлено в “Удалять автоматически”, то ПЕРЕД началом проведения программа очищает все движения по регистрам. Фактически это означает запись пустого набора записей регистра с видом записи – замещение. А значит, программа выполняет код из процедур “ПередЗаписью” и “ПриЗаписи” модуля набора записей регистров.

Если для какого-либо регистра определена подписка на событие “При записи”, то выполняется код из связанной процедуры.

2. Процедура “ОбработкаПроведения” модуля документа.

Обратим внимание: в начале обработки проведения у всех движений флаг модифицированности Ложь (значение возвращает метод Движения.Регистр.Модифицированность() ).

При работе с набором записей регистра (например, Движения.Регистр.Очистить() , Движения.Регистр.Добавить() и т.д.) флаг модифицированности становится Истина.

После записи движения в базу Движения.Регистр.Записать() модифицированность снова ложь.

Если в модуле процедуры подписки происходит запись набора регистра в явном виде ( .Записать() ), то программа выполняет код из процедур “ПередЗаписью” и “ПриЗаписи” модуля набора записей регистров и процедуры из подписки на событие “При записи” регистра.

3. Подписки на событие “При проведении” документа

Важно понимать : если в обработке проведения документа или в подписках на событие, вызванных ранее, не происходила запись движений регистров в явном виде (Движения.Регистр.Записать()), то движения документа еще НЕ записаны в базу. Поэтому их нельзя получить с помощью запроса, но можно получить из коллекции движений источника.

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

Если регистры записываются с помощь метода Записать () , то выполняются все связанные процедуры.

4. Запись движений.

Вспомним про свойство “Запись движений при проведении” из настроек документа.

Если оно равно “Записывать модифицированные”, то в базу будут записаны все движения документа, у которых флаг “Модифицированность” Истина.

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

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

И в конце р ассмотрим несколько примеров:

Пусть свойство документа “Запись движений при проведении” равно “Записывать модифицированные”, а “Удаление движений” – “Не удалять автоматически”.

При такой процедуре проведения документ при каждом перепроведении будет добавлять запись в регистр, записи будут множиться. Т.к. строка //*** добавляет записи в регистр, признак Модифицированности снимается.

Правильнее будет написать строку //*** как

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

В 1С 8 движения документа могут формироваться не только в обработке проведения, но и извне, например, из некоторой служебной обработки (так реализовано допроведение документов, восстановление авансов и т.д.).

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

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

Если в процессе проведения документа движения по регистрам формируются не с помощью коллекции Движения, принадлежащей внутреннему объекту , а другими способами (вручную в форме набора записей или как в примере 2 и т.д.), то на этапе 4 эти записи будут замещены. Чтобы избежать замещения в типовых базах, для документа “ОперацияБух” свойство документа “Проведение” устанавливается в “Запретить”.

Если документ должен проводиться по другим регистрам и нельзя запретить проведение, тогда нужно внимательно настраивать свойства документа:

– выбрать вариант записи движений “Записывать выбранные” и убедиться, что Движения.Регистр.Записывать = Ложь

– выбрать вариант записи движений “Записывать модифицированные” и контролировать признак Модифицированности для набора записей этого регистра.

Нужно понимать, что объект, полученный по ссылке (назовем его “ОбъектДок”), и внутренний объект (“ЭтотОбъект”), созданный в памяти в момент проведения, это два разных экземляра объектов.

Соответственно и коллекции движений у них будут разные. У “ОбъектаДок” коллекция движений будет включать только записанный в базу набор записей регистра, а у “ЭтогоОбъекта” – как записанные, так и добавленные и незаписанные записи. По окончании проведения (этап 4) в базу будут записаны наборы записей “ЭтогоОбъекта”, причем с признаком Замещать = Истина.

Если записи в набор записей добавляются по способу, описанному выше, то они могут быть замещены на этапе 4.

Как найти движение документа по регистру и удалить его?

Я
   Колумбарий

15.11.05 – 11:20

Сабж.. Какой объект и какие методы.

   Волшебник

Модератор

1 – 15.11.05 – 11:22

Все дороги ведут к НаборЗаписей

   Колумбарий

2 – 15.11.05 – 11:26

предупреждаю, буду вести себя нагло и безобломно. 🙂 Мне типа больше всех надо.

Ясно, спасибо. Но видимо нужно установить отбор по текущему регистратору? Как это сделать? Через Свойство Отбор? А как добавить в отбор значение равное регистратору?

   Волшебник

Модератор

3 – 15.11.05 – 11:27

(2) Посмотрим, кто кого обломает. Я буду отвечать на твои вопросы, совершенно правильно, а ты уж постарайся понять.

см. объект ЭлементОтбора

   Волшебник

Модератор

4 – 15.11.05 – 11:29

Еще есть свойство Движения у ДокументОбъект. Это уже готовые наборы на блюдечке с голубой каемочкой.

   Волшебник

Модератор

5 – 15.11.05 – 11:30

Еще можно снять проведение документа, и если в Конфигураторе в свойствах документа стоит признак “Удалять движения автоматически”, то они будут удалены.

   Волшебник

Модератор

6 – 15.11.05 – 11:31

Еще можно использовать запрос и менеджер записи (если это регистр сведений).

   Колумбарий

7 – 15.11.05 – 11:33

(4) Можно написать

ЭтотОбъект.Движения.<ИмяРегистра>.Удалить(); ?

   Волшебник

Модератор

8 – 15.11.05 – 11:36

(7) нет. Только Записать!

   Колумбарий

9 – 15.11.05 – 11:42

(8) Такой не слишком корявый:

   ПоследняяЗапись = ЭтотОбъект.Движения.ИсходящиеПлатежи.Количество();

   Пока ПоследняяЗапись<>0 Цикл

       ЭтотОбъект.Движения.ИсходящиеПлатежи.Удалить(ЭтотОбъект.Движения.ИсходящиеПлатежи.Получить(ПоследняяЗапись));

       ПоследняяЗапись = ПоследняяЗапись-1;

   КонецЦикла;

Вроде делает что надо. что в нем можно еще улучшить?

Можно аписать так:

“ПоследняяЗапись–“?

   Волшебник

Модератор

10 – 15.11.05 – 11:47

(9) Какой кошмарный код…

   Колумбарий

11 – 15.11.05 – 11:50

(10) Давай, напиши красивый, я его запомню. Я хорошо запоминаю

   Волшебник

Модератор

12 – 15.11.05 – 11:52

(11) мой код в 3 строчки (не проверял):

Набор = РегистрНакопления.СоздатьНаборЗаписей();

Набор.Отбор.Регистратор.Значение = Ссылка;

Набор.Записать();

   Волшебник

Модератор

13 – 15.11.05 – 11:53

(12)+ Все допущенные ошибки следует рассматривать как специальные.

   Колумбарий

14 – 15.11.05 – 12:06

13, враки на счет 3-х строчек, должна быть четветрая. А то вот что:

{Документ.ОплатаИностранномуПоставщику.Форма.ФормаДокумента(354,10)}: Переменная не определена (РегистрНакопления)

   Набор = <<?>>РегистрНакопления.СоздатьНаборЗаписей();

   Волшебник

Модератор

15 – 15.11.05 – 12:08

(14) Читаем внимательно 13-й пост. Андрей, ты меня разочаровываешь…

   Колумбарий

16 – 15.11.05 – 12:16

15. Не стыдно.

Получилось так:

   Набор = РегистрыНакопления.ИсходящиеПлатежи.СоздатьНаборЗаписей();

   Набор.Отбор.Регистратор.Значение = Ссылка;

   Набор.Записать();

А каков смысл этого кода? Типа создаем пустой набор и как бы пришиваем этот пустой набор к нашему документу-регистратору? А куда девается тот набор, в котором есть джвижения? Его аист уносит в лучший из миров?

   Волшебник

Модератор

17 – 15.11.05 – 12:18

   Колумбарий

18 – 15.11.05 – 12:19

Ну спасибо.

  

Волшебник

Модератор

19 – 15.11.05 – 12:24

(18) Кстати, если не устанавливать отбор, а вместо регистров накопления использовать регистр сведений, неподчиненный регистратору, то можно легко удалить все его записи:

//был регистр

РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей().Записать();

//и нет регистра…

Содержание:

1.       Что такое регистратор в 1С 8.3?

2.       Отбор записей с конкретным типом регистратора в запросе  

1.    Что такое регистратор в 1С 8.3?

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

Вначале дадим четкое определение понятию регистратора. Итак, регистратор – это некий документ, который создаёт записи в регистре сведений, точнее – документ, который владеет записями регистра.

Следующее понятие, которое также следует определить – запись. Это некоторый элемент в данных, которые находятся в регистре; поля с их значениями.

Последние, что нужно знать, чтобы перейти к основной теме – это регистры. Они бывают четырёх видов:

· регистр бухгалтерии – некий объект, в котором хранятся данные для бухгалтерского учёта. Благодаря этому объекту проводится аналитический учёт: многоуровневый и многомерный;

· регистр накопления – объект, в котором хранится информация о содержании материальных средств (деньги, продукция, материалы и так далее); с помощью этого объекта автоматизируются направления складского учёта, планирования и так далее.

· регистр расчёта – объект, в котором хранятся записи по видам расчёта и промежуточные данные, а также результаты расчетов;

· регистр сведений – объект, в котором хранятся различные данные, в виде резерва (валютные курсы, цены на предприятии и так далее).  

2.    Отбор записей с конкретным типом регистратора в запросе

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

Выбор конкретного типа регистратора

Рис. 1 Выбор конкретного типа регистратора

Итак, рассмотрим подробнее: первые 2 варианта – с использованием оператора «ССЫЛКА» или функции «ТИПЗНАЧЕНИЯ». Но с помощью «ВЫРАЗИТЬ» значение будет приведено лишь к одному из типов, как показано на скриншоте ниже:

ВЫРАЗИТЬ для приведения значения к определенному типу регистратора


Рис. 2 ВЫРАЗИТЬ для приведения значения к определенному типу регистратора

По сути, как видим, оператор не выполнит отбор. Чтобы отбор, всё же, выполнился, необходимо установить отбор в графе «ГДЕ».

Также не «отбрасывает» ненужные соединения, а только прибавляет отбор с фильтрацией по типу оператор «ССЫЛКА» (проверяем при помощи консоли, во вкладке просмотра плана запроса). В операторе «ВЫРАЗИТЬ» чётко видим, что поле имеет не составной тип, а лишь точную ссылку, так что ненужных соединений не будет. Но, в «ССЫЛКА» существует некоторая специфика, рассмотрим её на скриншоте ниже:

Специфика оператора «ССЫЛКА»

Рис. 3 Специфика оператора «ССЫЛКА»

Когда ставим вместо «ЦеноваяГруппа», как значение у параметра, ссылку некоторого справочника «Номенклатура», то выведется ошибка системы.

Если в качестве значения параметра ЦеноваяГруппа установить, например, ссылку на справочник «Номенклатура», система выдаст ошибку:

Ошибка несовместимости с оператором ССЫЛКА

Рис. 4 Ошибка несовместимости с оператором ССЫЛКА

Дело в том, что когда происходит работа с некоторыми реквизитами, у которых составной тип данных, то возникнет точно такая же ошибка. Рассмотрим пример: пусть есть документ «РеализацияТоваровУслуг». Этот документ не является составным типом из реквизита «ДокументОснование» внутри документа с названием «Авансовый отчёт», выполняем запрос, из-за угла возникает ошибка, как на скриншоте ниже:

Возникновение ошибки создания запроса

Рис. 5 Возникновение ошибки создания запроса

Также конструктор запросов не станет открываться (учтём, что «ТИПЗНАЧЕНИЯ» был указан верно).

Техническая поддержка из 1С объясняет это так: «Ошибка создания запроса происходит, когда в выражении, которое проверяем, тип не содержит ссылку на таблицу, которую проверяем».

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

Специалист компании «Кодерлайн»

Айдар Фархутдинов

Добавить комментарий