Управляемые блокировки на два счета
22.12.2012
10:15
#1
"Уважаемые программисты, подскажите пожалуйста, как мне установить блокировки сразу на несколько счетов, а не на один, привидите пример, для экзамена надо, не могу справиться<br><br>Вот пример моей работы, в ней используется получение остатков по двум счетам: ПланыСчетов.Бухгалтерский.ПервоначальнаяСтоимость и ПланыСчетов.Бухгалтерский.Амортизация , потому их оба нужно заблокировать:<br> <br> <br><pre>Процедура ОбработкаПроведения(Отказ, РежимПроведения)<br><br> <br> //установим блокировку<br> Блокировка = Новый БлокировкаДанных;<br> ЭлементБД = Блокировка.Добавить("РегистрБухгалтерии.Проводки");<br> ЭлементБД.УстановитьЗначение("Счет", ПланыСчетов.Бухгалтерский.ПервоначальнаяСтоимость);<br> ЭлементБД.УстановитьЗначение("Организация", Организация);<br> ЭлементБД.Режим = РежимБлокировкиДанных.Исключительный;<br> Блокировка.Заблокировать();<br> <br> Запрос = Новый Запрос;<br> Запрос.Текст =<br> "ВЫБРАТЬ<br> | ПроводкиОстаткиИОбороты.СуммаОборотКт<br> |ИЗ<br> | РегистрБухгалтерии.Проводки.ОстаткиИОбороты(&ПериодНачало, &ПериодКонец, Месяц, ДвиженияИГраницыПериода, Счет = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Амортизация), , ) КАК ПроводкиОстаткиИОбороты";<br> <br> Запрос.УстановитьПараметр("ПериодКонец", КонецМесяца(Дата));<br> Запрос.УстановитьПараметр("ПериодНачало", НачалоМесяца(Дата));<br> Запрос.УстановитьПараметр("Организация", Организация);<br> Результат = Запрос.Выполнить();<br> ТЗ = Результат.Выгрузить();<br> ВыборкаДетальныеЗаписи = Результат.Выбрать();<br> <br> Пока ВыборкаДетальныеЗаписи.Следующий() Цикл<br> Если ВыборкаДетальныеЗаписи.СуммаОборотКт > 0 Тогда<br> Отказ = Истина;<br> КонецЕсли;<br> КонецЦикла;<br> <br> Если НЕ Отказ Тогда<br> <br> Движения.Проводки.Записать(); //очистим старые движения<br> <br> Запрос = Новый Запрос;<br> Запрос.УстановитьПараметр("Организация", Организация);<br> Запрос.УстановитьПараметр("Период", Дата);<br> Запрос.Текст =<br> "ВЫБРАТЬ РАЗЛИЧНЫЕ<br> | ИспользуетсяОС.ОсновноеСредство КАК ОсновноеСредство,<br> | ИспользуетсяОС.СрокПолезногоИспользования<br> |ПОМЕСТИТЬ ИспользуемыеОС<br> |ИЗ<br> | РегистрСведений.СостояниеОСОрганизации.СрезПоследних(, ) КАК ИспользуетсяОС<br> |ГДЕ<br> | ИспользуетсяОС.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОС.Используется)<br> |<br> |СГРУППИРОВАТЬ ПО<br> | ИспользуетсяОС.ОсновноеСредство,<br> | ИспользуетсяОС.СрокПолезногоИспользования<br> |<br> |ИНДЕКСИРОВАТЬ ПО<br> | ОсновноеСредство<br> |;<br> |<br> |////////////////////////////////////////////////////////////////////////////////<br> |ВЫБРАТЬ РАЗЛИЧНЫЕ<br> | ПроводкиОстаткиПервСтоим.СуммаОстаток,<br> | ПроводкиОстаткиПервСтоим.Субконто1,<br> | ПроводкиОстаткиПервСтоим.Подразделение<br> |ПОМЕСТИТЬ ТаблПервСтоим<br> |ИЗ<br> | РегистрБухгалтерии.Проводки.Остатки(<br> | &Период,<br> | Счет = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.ПервоначальнаяСтоимость),<br> | ,<br> | Организация = &Организация<br> | И Субконто1 В<br> | (ВЫБРАТЬ РАЗЛИЧНЫЕ<br> | ИспользуемыеОС.ОсновноеСредство<br> | ИЗ<br> | ИспользуемыеОС КАК ИспользуемыеОС)) КАК ПроводкиОстаткиПервСтоим<br> |;<br> |<br> |////////////////////////////////////////////////////////////////////////////////<br> |ВЫБРАТЬ<br> | ИспользуемыеОС.ОсновноеСредство,<br> | ИспользуемыеОС.СрокПолезногоИспользования,<br> | ТаблПервСтоим.СуммаОстаток КАК СуммаОстатокПервСтоим,<br> | ЕСТЬNULL(ПроводкиОстаткиНачАморт.СуммаОстатокКт, 0) КАК СуммаОстатокКт,<br> | ВЫБОР<br> | КОГДА ТаблПервСтоим.СуммаОстаток > ЕСТЬNULL(ПроводкиОстаткиНачАморт.СуммаОстатокКт, 0)<br> | ТОГДА ВЫРАЗИТЬ(ТаблПервСтоим.СуммаОстаток / ИспользуемыеОС.СрокПолезногоИспользования КАК ЧИСЛО(15, 2))<br> | ИНАЧЕ """"ТребуетсяСписать""""<br> | КОНЕЦ КАК СуммаАмортизации,<br> | ТаблПервСтоим.Подразделение<br> |ИЗ<br> | ИспользуемыеОС КАК ИспользуемыеОС<br> | ЛЕВОЕ СОЕДИНЕНИЕ ТаблПервСтоим КАК ТаблПервСтоим<br> | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Проводки.Остатки(<br> | &Период,<br> | Счет = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Амортизация),<br> | ,<br> | Организация = &Организация<br> | И Субконто1 В<br> | (ВЫБРАТЬ РАЗЛИЧНЫЕ<br> | ИспользуемыеОС.ОсновноеСредство<br> | ИЗ<br> | ИспользуемыеОС КАК ИспользуемыеОС)) КАК ПроводкиОстаткиНачАморт<br> | ПО ТаблПервСтоим.Субконто1 = ПроводкиОстаткиНачАморт.Субконто1<br> | И ТаблПервСтоим.Подразделение = ПроводкиОстаткиНачАморт.Подразделение<br> | ПО ИспользуемыеОС.ОсновноеСредство = ТаблПервСтоим.Субконто1";<br> <br> Результат = Запрос.Выполнить();<br> ТЗ = Результат.Выгрузить();<br> Движения.Проводки.Записывать = Истина;<br> Выборка = Результат.Выбрать();<br> <br> Пока Выборка.Следующий() Цикл<br> Если Выборка.СуммаАмортизации = "ТребуетсяСписать" Тогда<br> сообщить("Амортизация основного средства: "+Выборка.ОсновноеСредство+". с подразделения: "+Выборка.Подразделение+" была ранее списана полностью");<br> продолжить;<br> КонецЕсли;<br> Если Выборка.СуммаОстатокКт+Выборка.СуммаАмортизации > Выборка.СуммаОстатокПервСтоим Тогда<br> СумАморт=Выборка.СуммаОстатокПервСтоим-Выборка.СуммаОстатокКт;<br> сообщить("Амортизация основного средства: "+Выборка.ОсновноеСредство+". с подразделения: "+Выборка.Подразделение+" списана полностью");<br> ИначеЕсли Выборка.СуммаОстатокКт+Выборка.СуммаАмортизации = Выборка.СуммаОстатокПервСтоим Тогда<br> СумАморт=Выборка.СуммаАмортизации;<br> сообщить("Амортизация основного средства: "+Выборка.ОсновноеСредство+". с подразделения: "+Выборка.Подразделение+" списана полностью");<br> Иначе<br> СумАморт=Выборка.СуммаАмортизации;<br> КонецЕсли; <br> Движение = Движения.Проводки.Добавить();<br> Движение.СчетДт = ПланыСчетов.Бухгалтерский.Капитал;<br> <br> Движение.СчетКт = ПланыСчетов.Бухгалтерский.Амортизация; <br> БухгалтерияСервер.УстановитьСубконто(Движение.СчетКт, Движение.СубконтоКт, "ОсновныеСредства", Выборка.ОсновноеСредство);<br> <br> Движение.Период = КонецМесяца(Дата);<br> Движение.Сумма = СумАморт;<br> Движение.Организация = Организация;<br> Движение.ПодразделениеКт = Выборка.Подразделение;<br> <br> КонецЦикла;<br> Иначе<br> Сообщить("В этом месяце амортизация уже начислялась");<br> КонецЕсли;<br>КонецПроцедуры</pre>"
22.12.2012
10:17
#2
В другом примере, при списании ОС, мне нужно заблокировать вообще три счета, не знаю, как это сделать, может как-то определить массив счетов и поставить их в блокировку?
22.12.2012
13:33
#3
"МассивСчетов = Новый Массив;<br> <br>МассивСчетов.Добавить("ПервоначальнаяСтоимость");<br>МассивСчетов.Добавить("Амортизация");<br> <br>ТЗ = Новый ТаблицаЗначений;<br> <br>ТЗ.Колонки.Добавить("Счет");<br> <br>МенеджерПС = ПланыСчетов.Бухгалтерский;<br> <br>Для Каждого ТекСчет Из МассивСчетов Цикл<br> <br> НовСтр = ТЗ.Добавить();<br> НовСтр.Счет= МенеджерПС[ТекСчет];<br> <br>КонецЦикла;<br> <br>Блокировка = Новый БлокировкаДанных;<br>ЭлементБД = Блокировка.Добавить("РегистрБухгалтерии.Проводки");<br>ЭлементБД.УстановитьЗначение("Организация", Организация);<br>ЭлементБД.ИсточникДанных = ТЗ;<br>ЭлементБД.ИспользоватьИзИсточникаДанных("Счет", "Счет");<br>Блокировка.Заблокировать();"
22.12.2012
13:49
#4
Лепота-аа!!!<br> <br> Препод сразу поймёт, что навряд ли начинающий эту красоту придумал!
Документ Операция как работать с таблицей?Увольнение задним числом: как удержать НДФЛ с компенсации отпуска
Читают тему
(гостей: 1)