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

Решенные Задачи из сборника 1С Специалист по платформе 8.2

Автор pershinsergei, 20 янв 2011, 07:28

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

vvvlad85

Подскажите при сдаче на 1С Специалиста по платформе при считывании данных из остатка как правильно (или какая в них разница):
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

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

joe_kam

Цитата: vvvlad85 от 26 июл 2011, 19:27
Подскажите при сдаче на 1С Специалиста по платформе при считывании данных из остатка как правильно (или какая в них разница):
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

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

Цитировать
БлокироватьДляИзменения (LockForUpdate)
Использование:

Чтение и запись.
Описание:

Тип: Булево.
Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей. Имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи. В этом случае можно не использовать объект БлокировкаДанных.
При попытке использования в автоматическом режиме блокировки вызывает исключительную ситуацию. После успешной записи документа свойство устанавливается в Ложь у всех наборов записей.
При отмене транзакции значение свойства восстанавливается в состояние до транзакции.
Значение по умолчанию Ложь.

Доступность:

Сервер, толстый клиент, внешнее соединение.

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

Мих8

Задачи видео примеры решения задач на see1c.ru:

http://see1c.ru/Solution_105.php 1.5  - Видео Решение 1C задачи (FIFO, по средней или LIFO).
http://see1c.ru/Solution_106.php 1.6  - Видео Решение 1C задачи (Срок годности товара)
http://see1c.ru/Solution-107.php 1.7  - Видео Решение 1C задачи ( Учет по складам, себестоимость FIFO, LIFO в целом по организации без учета складов)
http://see1c.ru/Solution-112.php 1.12 - Видео Решение 1C задачи (Резервирование товара менеджерами)
http://see1c.ru/Solution-1.13.php  1.13 - Видео Решение 1C задачи (Торговля стеллажами и комплектующими)
...

Мих8

Цитата: joe_kam от 03 авг 2011, 06:05
Цитата: vvvlad85 от 26 июл 2011, 19:27
Подскажите при сдаче на 1С Специалиста по платформе при считывании данных из остатка как правильно (или какая в них разница):
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

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

Цитировать
БлокироватьДляИзменения (LockForUpdate)
Использование:

Чтение и запись.
Описание:

Тип: Булево.
Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей. Имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи. В этом случае можно не использовать объект БлокировкаДанных.
При попытке использования в автоматическом режиме блокировки вызывает исключительную ситуацию. После успешной записи документа свойство устанавливается в Ложь у всех наборов записей.
При отмене транзакции значение свойства восстанавливается в состояние до транзакции.
Значение по умолчанию Ложь.

Доступность:

Сервер, толстый клиент, внешнее соединение.

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

О разнице между БлокировкаДанных и БлокироватьДляИзменения !
http://see1c.ru/Solution-107.php

bsgroups

http://narod.ru/disk/26328499001/Промо-диск.rar.html

- Курс по подготовке внедрения и изучению 1С 8 УПП и КА
- Разобранные примеры Специалист-Консультант 1С УПП
- Регламентированный учет в 1С Комплексная автоматизация 8 и УПП 8
- Учебный пример в 1С КА 8 и УПП 8
- Методика внедрения СМК и ИСО 9001
- Модуль (Обработка) 1С 8 «Универсальный построитель бизнес-процессов, Документооборот»
- Модуль (Обработка) 1С 8 «Автоматическое закрытие/перезакрытие месяца (по процедурам закрытия месяца)»
- Модуль (Обработка) 1С 8 «Автоматическое почтовое уведомление пользователей о снижении остатков ниже минимальных резервов»
- Модуль (Обработка) 1С 8 «Универсальная подсистема управлением статусами заказов с их цветным выделением»

ZDomen

ФИФО для момента поступления на любой склад
с контролем остатков при оперативном
по-новой методике проведения

РН.ОстаткиТовараНаСкладе
Реквизит.ОстаткиТовараНаСкладе
Реквизит.Склад
Ресурс.КоличествоОстаток

РН.ОстаткиТовараДляСебестоимости
Реквизит.Номенклатура
Реквизит.Партия
Ресурс.КоличествоОстаток
Ресурс.СуммаЗакупки

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

         вычисленное_СписываемоеКоличество = МИН(Остаток_СписываемоеКоличество
                                 ,тек_КоличествоОстаток
                                 );
         Если тек_КоличествоОстаток <= 0 Тогда
//            вычисленное_СуммаЗакупки = 0;
            прервать;
         Иначе
            вычисленное_СуммаЗакупки = вычисленное_СписываемоеКоличество
                                 / тек_КоличествоОстаток
                                 * тек_СуммаЗакупки;
         КонецЕсли;
         Движение = Движения.ОстаткиТовараДляСебестоимости.Добавить();
         Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
         Движение.Период = Дата;
         Движение.Номенклатура = ВыборкаПоНоменклатуре.Номенклатура;
         Движение.Партия = ВыборкаДетальныхЗаписей.Партия;//изменено от прихода
         Движение.КоличествоОстаток = вычисленное_СписываемоеКоличество;
         Движение.СуммаЗакупки = вычисленное_СуммаЗакупки;
         
         Остаток_СписываемоеКоличество = Остаток_СписываемоеКоличество - вычисленное_СписываемоеКоличество;
         Если Остаток_СписываемоеКоличество <= 0 Тогда
            Прервать;
         КонецЕсли;
      КонецЦикла;
      Если Остаток_СписываемоеКоличество > 0 Тогда
         Движение = Движения.ОстаткиТовараДляСебестоимости.Добавить();
         Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
         Движение.Период = Дата;
         Движение.Номенклатура = ВыборкаПоНоменклатуре.Номенклатура;
         //Движение.Партия = ВыборкаДетальныхЗаписей.Партия;//изменено от прихода
         Движение.КоличествоОстаток = Остаток_СписываемоеКоличество;//вычисленное_СписываемоеКоличество;
         Движение.СуммаЗакупки = 0;//вычисленное_СуммаЗакупки;
         
         Остаток_СписываемоеКоличество = 0;//на будущее
      КонецЕсли;
         
      Движение = Движения.ОстаткиТовараНаСкладе.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
      Движение.Период = Дата;
      Движение.Номенклатура = ВыборкаПоНоменклатуре.Номенклатура;
      Движение.Склад = Склад;
      Движение.КоличествоОстаток = ном_СписываемоеКоличество;
   КонецЦикла;
   
   Если ЭтотОбъект.ЗадержкаПриПроведении Тогда
      НемногоПодождем(60);//использовал для тестирования блокировок
   КонецЕсли;
   
   //запишем движения остатков перед ПРОВЕРКОЙ их отрицательности
   Движения.ОстаткиТовараНаСкладе.Записать();
   
   
   //проверка отрицательных остатков при оперативном проведении
   Если Режим = РежимПроведенияДокумента.Оперативный Тогда

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

КонецПроцедуры

ZDomen

         Сообщение.Поле = "Товары["+(ВыборкаОтрицОстатков.НомерСтроки-1)+"].Количество";
         Сообщение.УстановитьДанные(ЭтотОбъект);
         Сообщение.Сообщить();
         
         Отказ = ИСТИНА;
      КонецЦикла;
      
   КонецЕсли;
   

КонецПроцедуры

не вошло одним сообщением :)


ZDomen


         Сообщение.Поле = "Товары{"+(ВыборкаОтрицОстатков.НомерСтроки-1)+"}.Количество";
         Сообщение.УстановитьДанные(ЭтотОбъект);
         Сообщение.Сообщить();
         
         Отказ = ИСТИНА;
      КонецЦикла;
      
   КонецЕсли;
   

КонецПроцедуры

не вошло одним сообщением
квадратные скобки заменил фигурными
:)


ZDomen

после строки
//списание остатков
стоит лишняя строка
   Движения.ОстаткиТовараНаСкладе.Записывать = Истина;
(ее удаляем)
из-за этой строки система еще раз (автоматом) перезапишет регистры(а ведь они было записаны вручную)
...
можно поступить иначе
исправить тогда придется другую строку
а точнее, после строки
//запишем движения остатков перед ПРОВЕРКОЙ их отрицательности
исправляем строку
   Движения.ОстаткиТовараНаСкладе.Записать();
на строку
   Движения.Записать();
и система в этот момент перезапишет движения обоих регистров(и для остатков, и для себестоимости)
причем повторной(автоматической, т.е. по завершению процедуры проведения) записи этих регистров уже не будет, т.к. метод Движения.Записать(); выставит и Движения.ОстаткиТовараНаСкладе.Записывать и Движения.ОстаткиТовараНаСкладе.Записывать в ЛОЖЬ


ZDomen

имелось в виду, что после выполнения Движения.Записать()
и Движения.ОстаткиТовараНаСкладе.Записывать будет равно ЛОЖЬ
и Движения.ОстаткиТовараДляСебестоимости.Записывать будет тоже равно ЛОЖЬ

Теги:

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

Рейтинг@Mail.ru

Поиск