Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 04:30

Нумерация кассовых документов

Автор Dezmont89, 01 апр 2014, 09:18

0 Пользователей и 1 гость просматривают эту тему.

Dezmont89

Есть конфигурация, в ней много людей формируют кассовые документы(ПКО), то есть в один и тот же момент времени, может проводиться несколько документов.
Так вот проблема в том, что получается некоторые документы имеют дату например 01.04.14. 00:00:01 и номер 002, а другой 01.04.14. 00:00:02 - 001.
А нужно чтобы порядок сохранялся и по дате и по номеру. Почему так происходит, и как обойти?
Нумерация в пределах года.
База файловая.

wise

Цитата: Dezmont89 от 01 апр 2014, 09:18А нужно чтобы порядок сохранялся и по дате и по номеру.

вообще-то нумерация МОЖЕТ "плавать" в течении дня.

но если ОЧЕНЬ хочется... блокируй получение номера пока не запишется получивший номер документ.
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

Dezmont89

Цитата: wise от 01 апр 2014, 11:02
Цитата: Dezmont89 от 01 апр 2014, 09:18А нужно чтобы порядок сохранялся и по дате и по номеру.

вообще-то нумерация МОЖЕТ "плавать" в течении дня.

но если ОЧЕНЬ хочется... блокируй получение номера пока не запишется получивший номер документ.

Может плавать, но тут надо четко.
А можно более подробно про блокирование номера?

wise

(2) http://infostart.ru/public/144750/

Работа с управляемыми блокировками в примерах. Новая схема проведения документов 1с 8.2.

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

Будем рассматривать принципы работы управляемых блокировок на некоторой тестовой конфигурации. Учет ведется в разрезе номенклатуры и свойств номенклатуры. Приходная накладная (ПН) ничего не блокирует, но пишет данные в регистр накопления "Остаток товара". На примере документа Расходная накладная (РН) изучим, как работают управляемые блокировки, а затем посмотрим на новую схему проведения документов. В ПН и РН есть одинаковые по структуре табличные части (ТЧ) СписокНоменклатуры, в которых содержится список Номенклатуры, Свойств, Количество, Сумма, Цена:


В Регистре накопления есть соответсвующие измерения: Номенклатура, Свойство и два ресурса - Сумма и Количество.

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

Обратим внимание, что в файловой версии можно устанавливать блокировки только на таблицы целиком (см. таблицу ниже), построчные (в разрезе выбранных движений из регистра накопления, например) блокировки в файловом режиме не работают. Примеры тестировались на 1С 8.2 + MS SQL 2008 R2 Express.

eb691ced14ada9e783f91655f3844ed8.png

Детальнее про поддерживаемые режимы блокировок тут: http://v8.1c.ru/overview/Term_000000642.htm

Примеры рассматриваются на следующих РН и ПН:

ПН - 01

ПН - 02

РН - 01

Пример 1. Блокировка по конкретно известной номенклатурной позиции.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Движения.ОстаткиНоменклатуры.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Номенклатура",Справочники.Номенклатура.НайтиПоНаименованию("Ботинки")); //поиск по наименованию в целях примера
Блокировка.Заблокировать(); //установили блокировку по номенклатуре с наименованием "Ботинки"

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН - 01, сделать попытку провести ПН - 01, то она будет ожидать завершения блокировки регистра накопления по измерению "Номенклатура" с наименованием "Ботинки" и ПН - 02 будет ожидать завершения блокировки регистра накопления по измерению "Номенклатура" с наименованием "Ботинки".

Пример 2. Блокировка по конкретно известной паре номенклатурная позиция - свойство.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Движения.ОстаткиНоменклатуры.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию("Ботинки")); //поиск по наименованию в целях примера
ЭлементБлокировки.УстановитьЗначение("Свойство", Справочники.Свойства.НайтиПоНаименованию("черные 42 размера")); //поиск по наименованию в целях примера
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН - 01, сделать попытку провести ПН - 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений "Номенклатура" (с наименованием "Ботинки") -"Свойство" (с наименованием "черные 42 размера"), а ПН - 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары "Номенклатура"-"Свойство", которая будет образовывать соответвствующее движение.

Пример 3. Блокировка на всю таблицу регистра накопления.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН - 01, сделать попытку провести ПН - 01, то она будет ожидать завершения блокировки таблицы регистра накопления и ПН - 02 будет ожидать завершения блокировки таблицы регистра накопления.

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

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН - 01, сделать попытку провести ПН - 01, то она будет ожидать завершения блокировки регистра накопления по измерению "Номенклатура" и значением "Ботинки" из источника СписокНоменклатуры и ПН - 02 будет ожидать завершения блокировки регистра накопления по измерению "Номенклатура" и значением "Ботинки" из источника СписокНоменклатуры (так как именно такое значение реквизита "Номенклатура" в переданной как источник ТЧ).

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

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Блокировка = Новый БлокировкаДанных;

ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;

ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Свойство", "Свойство");
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН - 01, сделать попытку провести ПН - 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений "Номенклатура" значение "Ботинки" из переданного источника - "Свойство" значение "черные 42 размера" из переданного источника, а ПН - 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары "Номенклатура"-"Свойство", которая будет образовывать соответвствующее значениям полей источника блокировки движение.

Пример 6. Блокировка по двум полям из источника данных для блокировки.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

//условие "И" - будут заблокированы и записи для номенклатуры из ТЧ СписокНоменклатуры

// с любыми свойствами и записи для любой номенклатуры со свойствами из ТЧ СписокНоменклатуры
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Свойство", "Свойство");
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН - 01, сделать попытку провести ПН - 01, то она будет ожидать завершения блокировки регистра накопления по измерению "Номенклатура" значение "Ботинки" с любыми свойствами и отдельно по "Свойству" со значением "черные 42 размера" для любой номенклатуры, в ПН - 01 есть и номенклатура "Ботинки" и номенклатура со свойствами "черные 42 размера". Аналогично ПН - 02 будет ожидать завершения блокировки, так как в ПН - 02 есть номенклатура "Ботинки".

Пример 7. Новая схема проведения (чем же отличается БлокироватьДляИзменеия = Истина от блокировок при помощи объекта БлокировкаДанных).

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

//Новая схема (без механизма контроля остатков)

//Разбор БлокироватьДляИзменения = Истина
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать(); //Набор пустой, нет значений полей пространства блокировки. нечего блокировать.

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

Движение.Количество = СтрокаН.Количество;
Движение.Сумма = СтрокаН.Сумма;

Движение.Свойство = СтрокаН.Свойство;
КонецЦикла;

//1
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать(); //Набор не пустой будет выполнена блокировка, источник - ТЧ СписокТоваров


//Далее должен идти механизм контроля остатков

Как это работает:

Если в процессе проведение РН - 01, сделать попытку провести ПН - 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений "Номенклатура" значение "Ботинки" из переданного источника - "Свойство" значение "черные 42 размера" из переданного источника, а ПН - 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары "Номенклатура"-"Свойство", которая будет образовывать соответвствующее значениям полей источника блокировки движение.

При использовании команды БлокироватьДляИзменения = Истина на регистр накопления по значениям измерений движений установится исключительная блокировка. Никаких конструкций с использованием объекта БлокировкаДанных для этого писать не нужно.

Код под комментарием //1 выше аналогичен следующему коду:

//Работает аналогично, как и 1
Движения.ОстаткиНоменклатуры.Записать();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = Движения.ОстаткиНоменклатуры.Выгрузить();
Для Каждого Измерение Из Метаданные.РегистрыНакопления.ОстаткиНоменклатуры.Измерения Цикл
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(Измерение.Имя, Измерение.Имя);
КонецЦикла;
Блокировка.Заблокировать();


//Далее должен идти механизм контроля остатков

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



:P
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

markgenuine

А нельзя ли потом в конце месяца обработкой пройтись и нумерацию причесать?))
Сделать регламентное задание, которое например первого числа каждого месяца будет расчесывать предыдущий месяц?

Dezmont89

Цитата: markgenuine от 01 апр 2014, 13:15
А нельзя ли потом в конце месяца обработкой пройтись и нумерацию причесать?))
Сделать регламентное задание, которое например первого числа каждого месяца будет расчесывать предыдущий месяц?
Да в принципе может и можно. Только нужно в конце дня.
Добавлено: 01 апр 2014, 14:01


Цитата: wise от 01 апр 2014, 13:10
(2) http://infostart.ru/public/144750/

:P
Но тут, блокировки идут на регистры. И не могу сообразить как заблокировать получение номера с помощью блокировки данных.
А блокировать регистр мне кажется не имеет смысла?

wise

(5)
>>Да в принципе может и можно. Только нужно в конце дня.

это, КОНЕЧНО, можно... а КАК же быть с теми документами, которые распечатаны с НЕВЕРНЫМ номером.??

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

Похожие темы (5)

Рейтинг@Mail.ru

Поиск