Выходит ошибка в 1с. Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки. Если не выходит ошибка, то медленно проводит накладные секунд 20 каждую.
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.ПолныеПрава.Модуль(1283)}: Ошибка при вызове метода контекста (Записать)
Сервер Intel Xeon E312xx(SandyBridge) 2.5 ОЗУ 28 SSD СУБД Postgree Pro 11.4.1 база весит 30 гигов
(3)Судя по логам,вы загружаете какой то объект и при записи с использованием общих реквизитов,он у вас выдает ошибку.Пробовали перезапускать службы сервера?Конечно хорошо бы по мониторить,конкретно на что он ругается,и в случае не надобности исключить этот реквизит.На худой конец можно отключить блокировки.Но надо этим нужно подумать.
13.
solodovnikov.84
1112.09.19 13:56 Сейчас в теме
(12)Реиндексация и реструктуризация думаю не поможет.По всей видимости при записи в этот регистр с работой других пользователей и ругается.А пробовали этот процесс запускать,когда в базе никто не работает?
(13) когда бухгалтер не проводит, а проводит кассир проводится но медленно
_AccRgAT0<n>» - таблица итогов (остатки и обороты) по счету в целом. Эта таблице хранит итоги по всем счетам (которые имеют субконто и которые не имеют) и состоит из следующих полей:
состоит из следующих полей:
Счет учета (_AccountRRef)
накладные и платежные поступления используют один 62 счет на него наверно ругается
15.
solodovnikov.84
1112.09.19 14:10 Сейчас в теме
(14)Возможно.Но не факт,что это счет.Может быть любой реквизит.Или сама запись в целом.Например когда бухгатер сохраняет свой документ и вы загружаете,мол записи одновременно не сохраняются.
// Сохранение в параметре сеанса ГраницыЗапретаИзмененияДанных границ запрета изменений данных
Процедура УстановитьПараметрГраницыЗапретаИзмененияДанных() Экспорт
Если РольДоступна("ПолныеПрава") И НЕ Константы.ПрименятьДатуЗапретаДляПолныхПрав.Получить() Тогда
ПараметрыСеанса.ГраницыЗапретаИзмененияДанных = Новый ХранилищеЗначения(Неопределено, Новый СжатиеДанных(0));
Возврат;
КонецЕсли;
ТекстЗапросаПоОрганизациям = "
|ВЫБРАТЬ
| Значение(Справочник.Организации.ПустаяСсылка) как Организация
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| Организации.Ссылка
| ИЗ
| Справочник.Организации КАК Организации ";
ТекстЗапросаПоОбщейДатеЗапретаРедактирования = "ВЫБРАТЬ
| ЕстьNull(ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений, ДатаВремя(1,1,1)) КАК ОбщаяДата
|ИЗ
| РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных
|ГДЕ
| ГраницыЗапретаИзмененияДанных.Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
| И ГраницыЗапретаИзмененияДанных.Пользователь = НЕОПРЕДЕЛЕНО";
ТекстЗапросаПоПриоритетамЗаписей = "ВЫБРАТЬ
| Границы.Организация КАК Организация,
| Границы.Пользователь КАК Пользователь,
| ВЫБОР
| КОГДА Границы.Пользователь = НЕОПРЕДЕЛЕНО
| ТОГДА 3
| КОГДА Границы.Пользователь ССЫЛКА Справочник.ГруппыПользователей
| И ГруппыПользователей.Пользователь = &Пользователь
| ТОГДА 2
| КОГДА Границы.Пользователь ССЫЛКА Справочник.Пользователи
| И Границы.Пользователь = &Пользователь
| ТОГДА 1
| КОНЕЦ КАК Приоритет,
| Границы.ГраницаЗапретаИзменений КАК ГраницаЗапретаИзменений
|ИЗ
| РегистрСведений.ГраницыЗапретаИзмененияДанных КАК Границы
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователей
| ПО (ГруппыПользователей.Пользователь = &Пользователь И ГруппыПользователей.Ссылка = Границы.Пользователь)";
Показать
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Организации.Организация как Организация,
| МИНИМУМ(ЕСТЬNULL(ТаблицаГраницыЗапрета.ГраницаЗапретаИзменений, ОбщаяДатаЗапрета.ОбщаяДата)) КАК ГраницаЗапретаИзменений,
| ОбщаяДатаЗапрета.ОбщаяДата как ОбщаяДата
|ИЗ
| (" + ТекстЗапросаПоОрганизациям+") Как Организации
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| Границы.Организация КАК Организация,
| МИНИМУМ(Приоритеты.Приоритет) КАК Приоритет
| ИЗ
| РегистрСведений.ГраницыЗапретаИзмененияДанных КАК Границы
| ЛЕВОЕ СОЕДИНЕНИЕ (" + ТекстЗапросаПоПриоритетамЗаписей + ") КАК Приоритеты
| ПО Границы.Организация = Приоритеты.Организация
| И Границы.Пользователь = Приоритеты.Пользователь
|
| СГРУППИРОВАТЬ ПО
| Границы.Организация) КАК ТаблицаПриоритетов
| ПО ТаблицаПриоритетов.Организация = Организации.Организация
| ЛЕВОЕ СОЕДИНЕНИЕ (" + ТекстЗапросаПоПриоритетамЗаписей + ") КАК ТаблицаГраницыЗапрета
| ПО ТаблицаПриоритетов.Организация = ТаблицаГраницыЗапрета.Организация
| И ТаблицаПриоритетов.Приоритет = ТаблицаГраницыЗапрета.Приоритет,
| (" + ТекстЗапросаПоОбщейДатеЗапретаРедактирования + ") Как ОбщаяДатаЗапрета
|СГРУППИРОВАТЬ ПО
| Организации.Организация, ОбщаяДата";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Соответствие = Неопределено;
Иначе
Соответствие = Новый Соответствие;
Выборка = РезультатЗапроса.Выбрать();
ОбщаяДатаЗапрета = Неопределено;
Пока Выборка.Следующий() Цикл
Соответствие[Выборка.Организация] = ?(ЗначениеЗаполнено(Выборка.ГраницаЗапретаИзменений), КонецДня(Выборка.ГраницаЗапретаИзменений), Выборка.ГраницаЗапретаИзменений);
Если ОбщаяДатаЗапрета = Неопределено Тогда
ОбщаяДатаЗапрета = ?(ЗначениеЗаполнено(Выборка.ОбщаяДата), КонецДня(Выборка.ОбщаяДата), Выборка.ОбщаяДата);
КонецЕсли;
КонецЦикла;
Если НЕ ОбщаяДатаЗапрета = Неопределено Тогда
Соответствие["ОбщаяДатаЗапретаРедактирования"] = ОбщаяДатаЗапрета;
КонецЕсли;
Если Соответствие.Количество() = 0 Тогда
Соответствие = Неопределено;
КонецЕсли;
КонецЕсли;
Если Соответствие <> Неопределено Тогда
СохранятьСоответствие = Ложь;
Для Каждого КлючИЗначение Из Соответствие Цикл
ЕСли ЗначениеЗаполнено(КлючИЗначение.Значение) Тогда
СохранятьСоответствие = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ СохранятьСоответствие Тогда
Соответствие = Неопределено;
КонецЕсли;
КонецЕсли;
ПараметрыСеанса.ГраницыЗапретаИзмененияДанных = Новый ХранилищеЗначения(Соответствие, Новый СжатиеДанных(0));
КонецПроцедуры
[/1C-CODE]
Процедура УстановитьПараметрыСеансаДляОбменаСРозничнойТорговлей()
ЗапросПоУзламОбмена = Новый Запрос;
ЗапросПоУзламОбмена.Текст =
"ВЫБРАТЬ
| ОбменУправлениеПредприятиемРозничнаяТорговля.Ссылка,
| ОбменУправлениеПредприятиемРозничнаяТорговля.ДатаНачалаВыгрузкиДокументов,
| ОбменУправлениеПредприятиемРозничнаяТорговля.ДатаСвертки,
| ОбменУправлениеПредприятиемРозничнаяТорговля.СпособВыгрузкиСебестоимости
|ИЗ
| ПланОбмена.ОбменУправлениеПредприятиемРозничнаяТорговля КАК ОбменУправлениеПредприятиемРозничнаяТорговля
|ГДЕ
| ОбменУправлениеПредприятиемРозничнаяТорговля.Ссылка <> &ЭтотУзел";
ЗапросПоУзламОбмена.УстановитьПараметр("ЭтотУзел", ПланыОбмена.ОбменУправлениеПредприятиемРозничнаяТорговля.ЭтотУзел());
РезультатЗапроса = ЗапросПоУзламОбмена.Выполнить();
ПараметрыСеанса.НаличиеОбменаСРозничнойТорговлей = НЕ РезультатЗапроса.Пустой();
МассивВсехУзлов = ПроцедурыОбменаСРозничнойТорговлей.ПолучитьМассивВсехУзлов();
ПараметрыСеанса.ВсеУзлыОбменаСРозничнойТорговлей = Новый ФиксированныйМассив(МассивВсехУзлов);
Если ПараметрыСеанса.НаличиеОбменаСРозничнойТорговлей Тогда
ТаблицаОбменовУППРТ = РезультатЗапроса.Выгрузить();
ТаблицаОбменовУППРТ.Индексы.Добавить("Ссылка");
ПараметрыСеанса.СоответствиеУзловИДатДляОбменаУправлениеПредприятиемРозничнаяТорговля = Новый ХранилищеЗначения(ТаблицаОбменовУППРТ);
//установим соответствие реквизитов и узлов
СоответствиеРеквизитовИУзлов = Новый Соответствие;
//по складам
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Склады.Ссылка КАК Склад
|ИЗ
| Справочник.Склады КАК Склады";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СоответствиеРеквизитовИУзлов.Вставить(Выборка.Склад,
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоСкладу(Выборка.Склад));
КонецЦикла;
//вставим пустой склад
СоответствиеРеквизитовИУзлов.Вставить(Справочники.Склады.ПустаяСсылка(),
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоСкладу(Справочники.Склады.ПустаяСсылка()));
//теперь по кассам
Запрос.Текст =
"ВЫБРАТЬ
| Кассы.Ссылка КАК Касса
|ИЗ
| Справочник.Кассы КАК Кассы";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СоответствиеРеквизитовИУзлов.Вставить(Выборка.Касса,
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоКассе(Выборка.Касса));
КонецЦикла;
//вставим пустую кассу
СоответствиеРеквизитовИУзлов.Вставить(Справочники.Кассы.ПустаяСсылка(),
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоКассе(Справочники.Кассы.ПустаяСсылка()));
//и еще по кассам ККМ
Запрос.Текст =
"ВЫБРАТЬ
| КассыККМ.Ссылка КАК КассаККМ
|ИЗ
| Справочник.КассыККМ КАК КассыККМ";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СоответствиеРеквизитовИУзлов.Вставить(Выборка.КассаККМ,
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоКассеККМ(Выборка.КассаККМ));
КонецЦикла;
//вставим пустую кассу ККМ
СоответствиеРеквизитовИУзлов.Вставить(Справочники.КассыККМ.ПустаяСсылка(),
Показать
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоКассеККМ(Справочники.КассыККМ.ПустаяСсылка()));
//и еще по типам цен номенклатуры
Запрос.Текст =
"ВЫБРАТЬ
| ТипыЦенНоменклатуры.Ссылка КАК ТипЦеныНоменклатуры
|ИЗ
| Справочник.ТипыЦенНоменклатуры КАК ТипыЦенНоменклатуры";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СоответствиеРеквизитовИУзлов.Вставить(Выборка.ТипЦеныНоменклатуры,
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоТипуЦен(Выборка.ТипЦеныНоменклатуры));
КонецЦикла;
//вставим пустую кассу ККМ
СоответствиеРеквизитовИУзлов.Вставить(Справочники.ТипыЦенНоменклатуры.ПустаяСсылка(),
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоКассеККМ(Справочники.ТипыЦенНоменклатуры.ПустаяСсылка()));
//организации
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Организации.Ссылка КАК Организация
|ИЗ
| Справочник.Организации КАК Организации";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СоответствиеРеквизитовИУзлов.Вставить(Выборка.Организация,
ПроцедурыОбменаСРозничнойТорговлей.ПолучитьЗапросомМассивУзловПоОрганизации(Выборка.Организация));
КонецЦикла;
//запишем соответствие в хранилище и установим параметр сеанса
ПараметрыСеанса.СоответствиеРеквизитовИУзловОбменаСРозничнойТорговлей = Новый ХранилищеЗначения(СоответствиеРеквизитовИУзлов);
КонецЕсли;
КонецПроцедуры
Показать
Процедура ОпределитьФактИспользованияРИБ() Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Полный.Ссылка
|ИЗ
| ПланОбмена.Полный КАК Полный
|ГДЕ
| Полный.Ссылка <> &ЭтотУзелПолный";
Запрос.УстановитьПараметр("ЭтотУзелПолный", ПланыОбмена.Полный.ЭтотУзел());
ЕстьУзлыПолногоПланаОбмена = НЕ Запрос.Выполнить().Пустой();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОбменУППУПП.Ссылка,
| ОбменУППУПП.ДатаНачалаВыгрузкиДокументов КАК ДатаНачалаВыгрузкиДокументов
|ИЗ
| ПланОбмена.ОбменУППУПП КАК ОбменУППУПП
|ГДЕ
| ОбменУППУПП.Ссылка <> &ЭтотУзелПолный";
Запрос.УстановитьПараметр("ЭтотУзелПолный", ПланыОбмена.ОбменУППУПП.ЭтотУзел());
РезультатЗапроса = Запрос.Выполнить();
ЕстьУзлыОбменаУППУПП = НЕ РезультатЗапроса.Пустой();
ПараметрыСеанса.НаличиеОбменаУПП = ЕстьУзлыОбменаУППУПП;
Если ЕстьУзлыОбменаУППУПП Тогда
ТаблицаОбменовУППУПП = РезультатЗапроса.Выгрузить();
ТаблицаОбменовУППУПП.Индексы.Добавить("Ссылка");
ПараметрыСеанса.СоответствиеУзловИДатДляОбменаУПП = Новый ХранилищеЗначения(ТаблицаОбменовУППУПП);
МассивВсехУзлов = ПроцедурыОбменаУПП.ПолучитьМассивВсехУзлов();
ПараметрыСеанса.ВсеУзлыОбменаУПП = Новый ФиксированныйМассив(МассивВсехУзлов);
Запрос.Текст = "ВЫБРАТЬ
| Организации.Ссылка КАК Ссылка
|ИЗ
| Справочник.Организации КАК Организации";
МассивОрганизаций = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
МассивОрганизаций.Добавить(Справочники.Организации.ПустаяСсылка());
СоответствиеУзловИОрганизаций = Новый Соответствие;
Для Каждого Организация ИЗ МассивОрганизаций Цикл
МассивУзлов = ПроцедурыОбменаУПП.ПолучитьЗапросомМассивУзловПоОрганизации(Организация);
СоответствиеУзловИОрганизаций.Вставить(Организация, МассивУзлов);
КонецЦикла;
ПараметрыСеанса.СоответствиеОрганизацийИУзловОбменаУПП = Новый ХранилищеЗначения(СоответствиеУзловИОрганизаций);
КонецЕсли;
ПараметрыСеанса.ИспользованиеРИБ = ЕстьУзлыПолногоПланаОбмена ИЛИ ЕстьУзлыОбменаУППУПП;
ПараметрыСеанса.ПрефиксУзлаРаспределеннойИнформационнойБазы = Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Получить();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОбменУправлениеПредприятиемУправлениеТорговлей.Ссылка,
| ОбменУправлениеПредприятиемУправлениеТорговлей.ДатаНачалаВыгрузкиДокументов КАК ДатаНачалаВыгрузкиДокументов
|ИЗ
| ПланОбмена.ОбменУправлениеПредприятиемУправлениеТорговлей КАК ОбменУправлениеПредприятиемУправлениеТорговлей
|ГДЕ
| ОбменУправлениеПредприятиемУправлениеТорговлей.Ссылка <> &ОбменУправлениеПредприятиемУправлениеТорговлей";
Запрос.УстановитьПараметр("ОбменУправлениеПредприятиемУправлениеТорговлей", ПланыОбмена.ОбменУправлениеПредприятиемУправлениеТорговлей.ЭтотУзел());
РезультатЗапроса = Запрос.Выполнить();
ЕстьУзлыОбменаУТУПП = НЕ РезультатЗапроса.Пустой();
ПараметрыСеанса.НаличиеОбменаУТУПП = ЕстьУзлыОбменаУТУПП;
Если ЕстьУзлыОбменаУТУПП Тогда
ТаблицаОбменовУТУПП = РезультатЗапроса.Выгрузить();
ТаблицаОбменовУТУПП.Индексы.Добавить("Ссылка");
ПараметрыСеанса.СоответствиеУзловИДатДляОбменаУТУПП = Новый ХранилищеЗначения(ТаблицаОбменовУТУПП);
МассивВсехУзлов = ПроцедурыОбменаУТУПП.ПолучитьМассивВсехУзлов();
ПараметрыСеанса.ВсеУзлыОбменаУТУПП = Новый ФиксированныйМассив(МассивВсехУзлов);
Запрос.Текст = "ВЫБРАТЬ
| Организации.Ссылка КАК Ссылка
|ИЗ
| Справочник.Организации КАК Организации";
МассивОрганизаций = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
МассивОрганизаций.Добавить(Справочники.Организации.ПустаяСсылка());
СоответствиеУзловИОрганизаций = Новый Соответствие;
Для Каждого Организация ИЗ МассивОрганизаций Цикл
МассивУзлов = ПроцедурыОбменаУТУПП.ПолучитьЗапросомМассивУзловПоОрганизации(Организация);
СоответствиеУзловИОрганизаций.Вставить(Организация, МассивУзлов);
КонецЦикла;
ПараметрыСеанса.СоответствиеОрганизацийИУзловОбменаУТУПП = Новый ХранилищеЗначения(СоответствиеУзловИОрганизаций);
КонецЕсли;
// обмен с сайтом
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОбменССайтомТоварами.Ссылка КАК Ссылка
|ИЗ
| ПланОбмена.ОбменССайтомТоварами КАК ОбменССайтомТоварами
|ГДЕ
| (ОбменССайтомТоварами.Ссылка <> &ЭтотУзел)
|";
Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена.ОбменССайтомТоварами.ЭтотУзел());
МассивУзловДляОбменаССайтомТоварами = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
ПараметрыСеанса.ВсеУзлыДляОбменаССайтомТоварами = Новый ФиксированныйМассив(МассивУзловДляОбменаССайтомТоварами);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОбменССайтомЗаказами.Ссылка КАК Ссылка
|ИЗ
| ПланОбмена.ОбменССайтомЗаказами КАК ОбменССайтомЗаказами
|ГДЕ
| (ОбменССайтомЗаказами.Ссылка <> &ЭтотУзел)
|";
Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена.ОбменССайтомЗаказами.ЭтотУзел());
МассивУзловДляОбменаССайтомЗаказами = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
ПараметрыСеанса.ВсеУзлыДляОбменаССайтомЗаказами = Новый ФиксированныйМассив(МассивУзловДляОбменаССайтомЗаказами);
ПараметрыСеанса.НаличиеОбменаССайтом = (МассивУзловДляОбменаССайтомТоварами.Количество() + МассивУзловДляОбменаССайтомЗаказами.Количество() > 0);
ПараметрыСеанса.СохранятьИнформациюОМестеСозданияОбъектов = Константы.СохранятьИнформациюОМестеСозданияОбъектов.Получить();
//обмен с розничной торговлей
УстановитьПараметрыСеансаДляОбменаСРозничнойТорговлей();
КонецПроцедуры
Показать
// функция по пользователю ИБ определяет есть ли у него Windows авторизация
Функция НаличиеУПользователяWindowsАвторизации(Знач ИмяПользователяИБ) Экспорт
Если ПустаяСтрока(ИмяПользователяИБ) Тогда
Возврат Ложь;
КонецЕсли;
// находим пользователя ИБ
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователяИБ);
Если ПользовательИБ = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Возврат ПользовательИБ.АутентификацияОС;
КонецФункции
Показать
// Функция определяет наличение движения по регистрам для документа
//
Функция ОпределитьНаличиеДвиженийПоРегистратору(ДокументСсылка) Экспорт
ТекстЗапроса = "";
// для исключения падения для документов, проводящимся более чем по 256 таблицам
счетчик_таблиц = 0;
МетаданнныеДокумента = ДокументСсылка.Метаданные();
Если МетаданнныеДокумента.Движения.Количество() = 0 Тогда
Возврат Новый ТаблицаЗначений;
КонецЕсли;
Для Каждого Движение ИЗ МетаданнныеДокумента.Движения Цикл
// в запросе получаем имена регистров, по которым есть хотя бы одно движение
// например,
// ВЫБРАТЬ Первые 1 «РегистрНакопления.ТоварыНаСкладах»
// ИЗ РегистрНакопления.ТоварыНаСкладах
// ГДЕ Регистратор = &Регистратор
// имя регистра приводим к Строка(200), см. ниже
ТекстЗапроса = ТекстЗапроса + "
|" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + "
|ВЫБРАТЬ ПЕРВЫЕ 1 ВЫРАЗИТЬ(""" + Движение.ПолноеИмя()
+ """ КАК Строка(200)) КАК Имя ИЗ " + Движение.ПолноеИмя()
+ " ГДЕ Регистратор = &Регистратор";
// если в запрос попадает более 256 таблиц – разбиваем его на две части
// (вариант документа с проведением по 512 регистрам считаем нежизненным)
счетчик_таблиц = счетчик_таблиц + 1;
Если счетчик_таблиц = 256 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Запрос = Новый Запрос(ТекстЗапроса);
ЗАпрос.УстановитьПараметр("Регистратор", ДокументСсылка);
// при выгрузке для колонки «Имя» тип устанавливается по самой длинной строке из запроса
// при втором проходе по таблице новое имя может не «влезть», по этому сразу в запросе
// приводится к строка(200)
ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
ТаблицаЗапроса.Индексы.Добавить("Имя");
// если количество таблиц не превысило 256 – возвращаем таблицу
Если счетчик_таблиц = МетаданнныеДокумента.Движения.Количество() Тогда
Возврат ТаблицаЗапроса;
КонецЕсли;
// таблиц больше чем 256, делаем доп. запрос и дополняем строки таблицы.
ТекстЗапроса = "";
Для Каждого Движение ИЗ МетаданнныеДокумента.Движения Цикл
Если счетчик_таблиц > 0 Тогда
счетчик_таблиц = счетчик_таблиц - 1;
Продолжить;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + "
|ВЫБРАТЬ ПЕРВЫЕ 1 """ + Движение.ПолноеИмя() + """ КАК Имя ИЗ "
+ Движение.ПолноеИмя() + " ГДЕ Регистратор = &Регистратор";
КонецЦикла;
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаТаблицы = ТаблицаЗапроса.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Выборка);
КонецЦикла;
Возврат ТаблицаЗапроса;
КонецФункции
Показать
// Функция определяет наличие хотя бы одной записи в регистре сведений
//
// Параметры
// ИмяРегистра - строка
//
// Возвращаемое значение:
// Булево
//
Функция ЕстьЗаписиВРегистреСведений(ИмяРегистра) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РегСв.*
|ИЗ
| РегистрСведений." + ИмяРегистра + " КАК РегСв";
Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции // ЕстьЗаписиВРегистреСведений()
Процедура ЗаписатьНаборПрав(НаборПрав, Отказ, ШапкаОшибки)
Попытка
НаборПрав.Записать();
Исключение
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(),, ШапкаОшибки);
Отказ = Истина;
КонецПопытки;
КонецПроцедуры
Процедура ЗаписатьПраваДоступаПользователей(ТаблицаНабораПрав, СтруктураОтбора, Отказ = Ложь, ШапкаОшибки = "") Экспорт
// Проверим, что пользователь имеет права для использования процедуры
Если НЕ УправлениеДопПравамиПользователей.ЕстьПравоАдминистрированияПользователей() Тогда
ОбщегоНазначения.СообщитьОбОшибке("Нарушение прав доступа!",, ШапкаОшибки);
Возврат;
КонецЕсли;
НаборПрав = РегистрыСведений.НастройкиПравДоступаПользователей.СоздатьНаборЗаписей();
Для Каждого ЭлементСтруктуры Из СтруктураОтбора Цикл
Если Не ЭлементСтруктуры.Ключ = "ВладелецПравДоступа" Тогда
НаборПрав.Отбор[ЭлементСтруктуры.Ключ].Использование = Истина;
НаборПрав.Отбор[ЭлементСтруктуры.Ключ].Значение = ЭлементСтруктуры.Значение;
КонецЕсли;
КонецЦикла;
// Проверим набор на корректность установленных отборов
Если НаборПрав.Отбор.ОбъектДоступа.Использование Тогда
ОтборПоОбъектуДоступа = Истина;
ОбъектДоступа = НаборПрав.Отбор.ОбъектДоступа.Значение;
НаборПрав.Отбор.ВладелецПравДоступа.Установить(ОбъектДоступа);
НаборПрав.Отбор.ОбъектДоступа.Использование = Ложь;
ИначеЕсли НаборПрав.Отбор.Пользователь.Использование Тогда
ОтборПоОбъектуДоступа = Ложь;
НаборПрав.Отбор.НаследованаОтВсеПользователи.Установить(Ложь);
Если НЕ ЗначениеЗаполнено(НаборПрав.Отбор.Пользователь.Значение) Тогда
Отказ = Истина;
ОбщегоНазначения.СообщитьОбОшибке(ШапкаОшибки);
Возврат;
КонецЕсли;
Иначе
Отказ = Истина;
ОбщегоНазначения.СообщитьОбОшибке(ШапкаОшибки);
Возврат;
КонецЕсли;
ТаблицаРазличияСтрок = НаборПрав.Выгрузить();
ТаблицаРазличияЗаписей = НаборПрав.Выгрузить();
НаборПрав.Прочитать();
ТаблицаСтарогоНабора = НаборПрав.Выгрузить();
ТаблицаНовогоНабора = НастройкаПравДоступа.ПолучитьТаблицуПравДоступаБезУнаследуемыхЗаписей(ТаблицаНабораПрав);
НаборПрав.Загрузить(ТаблицаНовогоНабора);
НастройкаПравДоступа.ДополнитьНаборПравДоступаНаследуемымиЗаписями(НаборПрав);
Если ОтборПоОбъектуДоступа Тогда
НастройкаПравДоступа.ДополнитьНаборПравДоступаГруппамиПользователей(НаборПрав);
КонецЕсли;
ЗаписатьНаборПрав(НаборПрав, Отказ, ШапкаОшибки);
КонецПроцедуры // ЗаписатьПраваДоступаПользователей
Показать
////////////////////////////////////////////////////////////////////////////////
Процедура ЗарегистрироватьПраваДоступаПользователяКОбъекту(СсылкаНового, Родитель, Отказ = Ложь) Экспорт
Если НЕ Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(СсылкаНового)) Тогда
Возврат;
КонецЕсли;
Если СсылкаНового.ПолучитьОбъект() <> Неопределено Тогда
Возврат;
КонецЕсли;
НаборЗаписей = РегистрыСведений.НастройкиПравДоступаПользователей.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ОбъектДоступа.Установить(СсылкаНового);
НастройкаПравДоступа.ДополнитьНаборПравДоступаУнаследованнымиЗаписями(НаборЗаписей, СсылкаНового, Родитель);
ЗаписатьНаборПрав(НаборЗаписей, Отказ, "Не удалось записать права доступа к объекту!")
КонецПроцедуры
Показать
Функция ОбновитьПраваДоступаПользователейПоВладельцуДоступа(Ссылка, ОбновляемыйОбъект = Неопределено) Экспорт
ПраваДоступаПользователей = РегистрыСведений.НастройкиПравДоступаПользователей.СоздатьНаборЗаписей();
ПраваДоступаПользователей.Отбор.ОбъектДоступа .Установить(Ссылка);
ПраваДоступаПользователей.Отбор.ВладелецПравДоступа.Установить(Ссылка);
ПраваДоступаПользователей.Прочитать();
ПраваДоступаПользователей.Отбор.ОбъектДоступа.Использование = Ложь;
НастройкаПравДоступа.ДополнитьНаборПравДоступаНаследуемымиЗаписями(ПраваДоступаПользователей);
Попытка
ПраваДоступаПользователей.Записать(Истина);
Исключение
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции // ()
////////////////////////////////////////////////////////////////////////////////
Процедура УстановитьПараметрСеансаТекущиеУчетныеЗаписиНалогоплательщика() Экспорт
Запрос = Новый Запрос("ВЫБРАТЬ
| ПользователиУчетныхЗаписейДокументооборота.УчетнаяЗапись.Ссылка КАК УчетнаяЗапись
|ИЗ
| РегистрСведений.ПользователиУчетныхЗаписейДокументооборота КАК ПользователиУчетныхЗаписейДокументооборота
|ГДЕ
| ПользователиУчетныхЗаписейДокументооборота.Пользователь = &Пользователь");
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
МассивУчетныхЗаписей = Новый Массив;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
МассивУчетныхЗаписей.Добавить(Выборка.УчетнаяЗапись);
КонецЦикла;
МассивУчетныхЗаписейФиксированныйМассив = Новый ФиксированныйМассив(МассивУчетныхЗаписей);
ПараметрыСеанса.ТекущиеУчетныеЗаписиНалогоплательщика = МассивУчетныхЗаписейФиксированныйМассив;
КонецПроцедуры
Показать
Функция ПолучитьРезультатЗапросаПоВыборкеОрганизаций(ИмяСправочника, ИмяРеквизита, ИмяРеквизитаОрганизации, СсылкаНаСправочник) Экспорт
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ Различные
| Спр." + ИмяРеквизитаОрганизации + " КАК Организация
|ИЗ
| Справочник." + ИмяСправочника + " КАК Спр
|ГДЕ
| Спр." + ИмяРеквизита + " = &СсылкаНаЭлемент";
Запрос.УстановитьПараметр("СсылкаНаЭлемент", СсылкаНаСправочник);
Возврат Запрос.Выполнить();
КонецФункции
// МЕХАНИЗМ ПРОВЕРКИ ЗАПОЛНЕНИЯ ОТЧЕТОВ ПОД РЛС
// Функция проверяет есть используються ли роли с ограничением прав доступа на уровне записи
//
Функция ИспользуетсяОграниченияПравДоступаНаУровнеЗаписей() Экспорт
ИспользуетсяРЛС = Константы.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей.Получить();
ИспользуетсяРЛС = ИспользуетсяРЛС И Не РольДоступна("ПолныеПрава");
Возврат ИспользуетсяРЛС;
КонецФункции
Процедура УстановитьПараметрыМеханизмаОграниченияПравДоступа() Экспорт
ПараметрыСеанса.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей = Константы.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей.Получить();
Если ПараметрыСеанса.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВидыОбъектовДоступа.Ссылка,
| МАКСИМУМ(ВЫБОР
| КОГДА ПользователиГруппы.Ссылка ЕСТЬ NULL
| ТОГДА ИСТИНА
| ИНАЧЕ ВЫБОР
| КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа ЕСТЬ NULL
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| КОНЕЦ) КАК ЕстьОграничение
|ИЗ
| Перечисление.ВидыОбъектовДоступа КАК ВидыОбъектовДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыПользователей.ПользователиГруппы КАК ПользователиГруппы
| ПО (ПользователиГруппы.Пользователь = &ТекущийПОльзователь)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
| ПО (НазначениеВидовОбъектовДоступа.ГруппаПользователей = ПользователиГруппы.Ссылка)
| И (НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ВидыОбъектовДоступа.Ссылка)
|
|СГРУППИРОВАТЬ ПО
| ВидыОбъектовДоступа.Ссылка";
Запрос.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);
Выборка = Запрос.Выполнить().Выбрать();
ВидыОбъектовДоступаЗначения = Метаданные.Перечисления.ВидыОбъектовДоступа.ЗначенияПеречисления;
Пока Выборка.Следующий() Цикл
ПараметрыСеанса["ИспользоватьОграничениеПо" + ВидыОбъектовДоступаЗначения.Получить(Перечисления.ВидыОбъектовДоступа.Индекс(Выборка.Ссылка)).Имя] = Выборка.ЕстьОграничение;
КонецЦикла;
Иначе
Для Каждого ВидОбъектаДоступа Из Метаданные.Перечисления.ВидыОбъектовДоступа.ЗначенияПеречисления Цикл
ПараметрыСеанса["ИспользоватьОграничениеПо" + ВидОбъектаДоступа.Имя] = Ложь;
КонецЦикла;
КонецЕсли;
УстановитьПараметрСеансаТекущиеУчетныеЗаписиНалогоплательщика();
КонецПроцедуры
Показать
// Процедура удаляет из регистра сведений данные
// незарегистрированного контрагента.
//
Процедура УдалитьДанныеНезарегистрированногоКонтрагента(Ссылка, Отказ) Экспорт
НаборЗаписей = РегистрыСведений.ДанныеНезарегистрированныхКонтрагентов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ОбъектРегистратор.Использование = Истина;
НаборЗаписей.Отбор.ОбъектРегистратор.Значение = Ссылка;
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
НаборЗаписей.Очистить();
Попытка
НаборЗаписей.Записать(Истина);
Исключение
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки());
Отказ = Истина;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ ПРОВЕРКИ ПРИ ЗАПИСИ НОМЕНКЛАТУРЫ
// Функция проверяет, существуют ли ссылки на единицу измерения в движениях регистров накопления.
// Если есть - нельзя менять коэффицент
//
// Параметры:
// СуществуютСсылки - булево, переменная, в которой сохраняется результат работы функции, чтобы
// при последующих вызовах заново не считать функцию.
//
// Возвращаемое значение:
// Истина - если есть движения, Ложь - если нет.
//
Функция Номенклатура_СуществуютСсылки(Ссылка, СуществуютСсылки) Экспорт
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
Возврат Ложь;
ИначеЕсли СуществуютСсылки <> Неопределено Тогда
Возврат СуществуютСсылки; // уже было рассчитано
КонецЕсли;
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ТекущийВладелец", Ссылка);
ТипНоменклатура = ТипЗнч(Справочники.Номенклатура.ПустаяСсылка());
Запрос.Текст = "";
Для Каждого РегистрНакопления Из Метаданные.РегистрыНакопления Цикл
Для Каждого РеквизитРегистра Из РегистрНакопления.Измерения Цикл
Если РеквизитРегистра.Тип.СодержитТип(ТипНоменклатура) Тогда
Если Запрос.Текст <> "" Тогда
Запрос.Текст = Запрос.Текст + "
|ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления."+РегистрНакопления.Имя+"."+РеквизитРегистра.Имя+" КАК Номенклатура
|ГДЕ
| "+РеквизитРегистра.Имя+" = &ТекущийВладелец
|";
КонецЕсли;
КонецЦикла;
КонецЦикла;
СуществуютСсылки = НЕ Запрос.Выполнить().Пустой();
Возврат СуществуютСсылки;
КонецФункции // СуществуютСсылки()
// Функция проверяет, существуют ли ссылки на серию в движениях регистров накопления.
//
// Параметры:
//
// Возвращаемое значение:
// Истина - если есть движения, Ложь - если нет.
//
Функция Номенклатура_СуществуютСсылкиНаСерииВРегистрахНакопления(Ссылка) Экспорт
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("Номенклатура", Ссылка);
Запрос.УстановитьПараметр("СерияНоменклатуры", Справочники.СерииНоменклатуры.ПустаяСсылка());
ТипСерия = ТипЗнч(Справочники.СерииНоменклатуры.ПустаяСсылка());
Запрос.Текст = "";
Для Каждого РегистрНакопления Из Метаданные.РегистрыНакопления Цикл
Для Каждого РеквизитРегистра Из РегистрНакопления.Измерения Цикл
Если РеквизитРегистра.Тип.СодержитТип(ТипСерия) Тогда
Если Запрос.Текст <> "" Тогда
Запрос.Текст = Запрос.Текст + "
|ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
|ИЗ
| РегистрНакопления."+РегистрНакопления.Имя+" КАК "+РегистрНакопления.Имя+"
|ГДЕ
| "+РегистрНакопления.Имя+"."+РеквизитРегистра.Имя+" <> &СерияНоменклатуры
|И "+РегистрНакопления.Имя+"."+РеквизитРегистра.Имя+".Владелец = &Номенклатура
|";
КонецЕсли;
КонецЦикла;
КонецЦикла;
СуществуютСерии = НЕ Запрос.Выполнить().Пустой();
Возврат СуществуютСерии;
КонецФункции //СуществуютСсылкиНаСерииВРегистрахНакопления()
Показать
// Функция проверяет, существуют ли ссылки на вид номенклатуры в справочнике "Номенклатура".
// Если есть - нельзя менять коэффицент
//
// Параметры:
// СуществуютСсылки - булево, переменная, в которой сохраняется результат работы функции, чтобы
// при последующих вызовах заново не считать функцию.
//
// Возвращаемое значение:
// Истина - если есть движения, Ложь - если нет.
//
Функция ВидыНоменклатуры_СуществуютСсылкиВНоменклатуре(Ссылка, СуществуютСсылки) Экспорт
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
Возврат Ложь;
ИначеЕсли СуществуютСсылки <> Неопределено Тогда
Возврат СуществуютСсылки; // уже было рассчитано
КонецЕсли;
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ТекущийЭлемент", Ссылка);
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ВидНоменклатуры = &ТекущийЭлемент
|";
СуществуютСсылки = НЕ Запрос.Выполнить().Пустой();
Возврат СуществуютСсылки;
КонецФункции // СуществуютСсылки()
// Функция проверяет, существуют ли ссылки на статью затрат в движениях регистров накопления.
//
// Параметры:
// Ссылка - СправочникСсылка.СтатьиЗатрат - Статья затрат
//
// Возвращаемое значение:
// Булево - Истина - если есть движения,
// Ложь - если нет.
//
Функция СтатьяЗатрат_СуществуютСсылкиВРегистрахНакопления(Ссылка) Экспорт
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("СтатьяЗатрат", Ссылка);
ТипЗначения = ТипЗнч(Справочники.СтатьиЗатрат.ПустаяСсылка());
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.УчетЗатрат.АналитикаУчетаЗатрат
|ГДЕ
| АналитикаУчетаЗатрат В (
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| Ссылка
| ИЗ
| РегистрСведений.АналитикаУчетаЗатрат КАК РегистрАналитикаУчетаЗатрат
| ГДЕ
| СтатьяЗатрат = &СтатьяЗатрат
| )
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.УчетЗатратРегл.АналитикаУчетаЗатрат
|ГДЕ
| АналитикаУчетаЗатрат В (
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| Ссылка
| ИЗ
| РегистрСведений.АналитикаУчетаЗатрат КАК РегистрАналитикаУчетаЗатрат
| ГДЕ
| СтатьяЗатрат = &СтатьяЗатрат
| )
|";
Для Каждого РегистрНакопления Из Метаданные.РегистрыНакопления Цикл
Для Каждого РеквизитРегистра Из РегистрНакопления.Измерения Цикл
Если РеквизитРегистра.Тип.СодержитТип(ТипЗначения) Тогда
Запрос.Текст = Запрос.Текст + "
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
|ИЗ
| РегистрНакопления." + РегистрНакопления.Имя + " КАК " + РегистрНакопления.Имя + "
|ГДЕ
| " + РегистрНакопления.Имя + "." + РеквизитРегистра.Имя + " = &СтатьяЗатрат
|";
КонецЕсли;
КонецЦикла;
КонецЦикла;
СуществуютСсылки = НЕ Запрос.Выполнить().Пустой();
Возврат СуществуютСсылки;
КонецФункции // СтатьяЗатрат_СуществуютСсылкиВРегистрахНакопления()
Показать
Процедура ОбновитьПраваДоступаКПрошлымРодителям(Ссылка, ПрошлыйИзмененныйРодительОбъектаДоступа, Отказ) Экспорт
ОбновляемыеОбъекты = Новый Массив;
ОбновляемыеОбъекты.Добавить(ПрошлыйИзмененныйРодительОбъектаДоступа);
НастройкаПравДоступа.ПолучитьМассивРодительскихЭлементов(ПрошлыйИзмененныйРодительОбъектаДоступа, ОбновляемыеОбъекты);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| НастройкиПравДоступаПользователей.ОбъектДоступа КАК Ссылка
|ИЗ
| РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
|ГДЕ
| НастройкиПравДоступаПользователей.ОбъектДоступа = НастройкиПравДоступаПользователей.ВладелецПравДоступа И
| НастройкиПравДоступаПользователей.ОбъектДоступа В (&ОбновляемыеОбъекты)";
Запрос.УстановитьПараметр("ОбновляемыеОбъекты", ОбновляемыеОбъекты);
ОбновляемыеОбъекты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
Для каждого ОбновляемыйОбъект Из ОбновляемыеОбъекты Цикл
МассивЭлементов = НастройкаПравДоступа.ПолучитьМассивДочернихЭлементов(Ссылка);
МассивЭлементов.Добавить(Ссылка);
Для Каждого ПодчиненныйЭлемент ИЗ МассивЭлементов Цикл
ПраваДоступаПользователей = РегистрыСведений.НастройкиПравДоступаПользователей.СоздатьНаборЗаписей();
ПраваДоступаПользователей.Отбор.ОбъектДоступа .Установить(ПодчиненныйЭлемент);
ПраваДоступаПользователей.Отбор.ВладелецПравДоступа.Установить(ОбновляемыйОбъект);
Попытка
ПраваДоступаПользователей.Записать();
Исключение
Отказ = Истина;
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки() + Символы.ПС+ " .Не записаны права доступа к объекту: " + Ссылка);
Возврат;
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Показать
Функция ПолучитьСписокОбновляемыхОбъектовПриПереносеВГруппу(Ссылка, ОбновляемыеОбъекты) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| НастройкиПравДоступаПользователей.ОбъектДоступа КАК Ссылка
|ИЗ
| РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
|ГДЕ
| НастройкиПравДоступаПользователей.ОбъектДоступа = НастройкиПравДоступаПользователей.ВладелецПравДоступа и
| (НастройкиПравДоступаПользователей.ОбъектДоступа В (&ОбновляемыеОбъекты)";
Если НастройкаПравДоступа.ПолучитьИмяРеквизитаРодителяОбъектаДоступа(Ссылка) = "Родитель" Тогда
Запрос.Текст = Запрос.Текст + "
| ИЛИ НастройкиПравДоступаПользователей.ОбъектДоступа В ИЕРАРХИИ (&Ссылка))";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Иначе
Запрос.Текст = Запрос.Текст + ")";
КонецЕсли;
Запрос.УстановитьПараметр("ОбновляемыеОбъекты", ОбновляемыеОбъекты);
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции
Функция ПроверитьНаличиеСсылокНаДоговорКонтрагента(ДоговорКонтрагента) Экспорт
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ДоговорКонтрагента", ДоговорКонтрагента);
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрСведений.УсловияПоставокПоДоговорамКонтрагентовОбщие.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрСведений.УсловияПоставокПоДоговорамКонтрагентовПоНоменклатуре.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.РасчетыСКонтрагентами.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ЗаказыПокупателей.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ЗаказыПоставщикам.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ПартииТоваровПереданные.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ТоварыПереданные.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ТоварыПолученные.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.Продажи.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ПланируемыеПоступленияДенежныхСредств.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ЗаявкиНаРасходованиеСредств.ДоговорКонтрагента
|ГДЕ
| ДоговорКонтрагента = &ДоговорКонтрагента
|";
Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции
Функция Кассы_СуществуютСсылки(Касса) Экспорт
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
| РегистрНакопления.ДенежныеСредства.Регистратор КАК Документ
|ИЗ
| РегистрНакопления.ДенежныеСредства
|ГДЕ
| РегистрНакопления.ДенежныеСредства.БанковскийСчетКасса = &Касса";
Запрос.УстановитьПараметр("Касса", Касса);
Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции
Показать
Функция Категории_СуществуютСсылки(Категория) Экспорт
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
| РегистрСведений.КатегорииОбъектов.Категория КАК Категория
|ИЗ
| РегистрСведений.КатегорииОбъектов
|
|ГДЕ
| РегистрСведений.КатегорииОбъектов.Категория = &Категория
|";
Запрос.УстановитьПараметр("Категория", Категория);
Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции
Функция СвойстваОбъектов_СуществуютСсылки(Свойство) Экспорт
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрСведений.ЗначенияСвойствОбъектов.Свойство КАК Свойство
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов
|
|ГДЕ
| РегистрСведений.ЗначенияСвойствОбъектов.Свойство = &Свойство
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрСведений.НазначенияСвойствОбъектов.Свойство КАК Свойство
|ИЗ
| РегистрСведений.НазначенияСвойствОбъектов
|
|ГДЕ
| РегистрСведений.НазначенияСвойствОбъектов.Свойство = &Свойство
|";
Запрос.УстановитьПараметр("Свойство", Свойство);
Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции
Функция СерииНоменклатуры_СуществуютСсылки(СерияНоменклатуры) Экспорт
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("СерияНоменклатуры", СерияНоменклатуры);
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ТоварыНаСкладах.СерияНоменклатуры
|ГДЕ
| СерияНоменклатуры = &СерияНоменклатуры
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ТоварыОрганизаций.СерияНоменклатуры
|ГДЕ
| СерияНоменклатуры = &СерияНоменклатуры
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ПартииТоваровНаСкладах.СерияНоменклатуры
|ГДЕ
| СерияНоменклатуры = &СерияНоменклатуры
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегистрНакопления.ТоварыВНТТ.СерияНоменклатуры
|ГДЕ
| СерияНоменклатуры = &СерияНоменклатуры
|
|";
Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции
Показать
Функция Склад_СуществуютСсылки(Склад) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
| ТоварыНаСкладах.Регистратор КАК Документ
|ИЗ
| РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
|ГДЕ
| ТоварыНаСкладах.Склад = &Склад
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ПЕРВЫЕ 1
| ТоварыВРознице.Регистратор КАК Документ
|ИЗ
| РегистрНакопления.ТоварыВРознице КАК ТоварыВРознице
|ГДЕ
| ТоварыВРознице.Склад = &Склад
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ПЕРВЫЕ 1
| ТоварыВНТТ.Регистратор КАК Документ
|ИЗ
| РегистрНакопления.ТоварыВНТТ КАК ТоварыВНТТ
|ГДЕ
| ТоварыВНТТ.Склад = &Склад
|";
Возврат Не Запрос.Выполнить().Пустой();
КонецФункции
Показать
/
/ Процедура записывает набор записей на сервере (привилегированно)
//
Процедура ЗаписатьНаборЗаписейНаСервере(ИмяРегистра, Регистратор, ТаблицаДвижений = Неопределено, ТипРегистра = "РегистрНакопления") Экспорт
Если ТипРегистра = "РегистрНакопления" Тогда
Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
Если ТаблицаДвижений <> Неопределено Тогда
Набор.мТаблицаДвижений = ТаблицаДвижений;
ОбщегоНазначения.ВыполнитьДвижениеПоРегистру(Набор);
КонецЕсли;
Иначе
Если ТипРегистра = "РегистрБухгалтерии" Тогда
Набор = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей();
ИначеЕсли ТипРегистра = "РегистрСведений" Тогда
Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
ИначеЕсли ТипРегистра = "РегистрРасчета" Тогда
Набор = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей();
КонецЕсли;
Если ТаблицаДвижений <> Неопределено Тогда
Набор.Загрузить(ТаблицаДвижений);
КонецЕсли;
КонецЕсли;
Набор.Отбор.Регистратор.Установить(Регистратор);
Набор.Записать();
КонецПроцедуры
Показать
Функция ПолучитьПараметрыДокументовОприходования(МассивДокументов, Период) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Пост.ДоговорКонтрагента КАК ДоговорПоставки,
| Пост.Сделка,
| Пост.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК Валюта,
| КурсыВалютСрезПоследних.Курс,
| КурсыВалютСрезПоследних.Кратность,
| Пост.Ссылка,
| Пост.ДоговорКонтрагента.ВедениеВзаиморасчетов КАК ВедениеВзаиморасчетов
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Пост
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаКурса, ) КАК КурсыВалютСрезПоследних
| ПО Пост.ДоговорКонтрагента.ВалютаВзаиморасчетов = КурсыВалютСрезПоследних.Валюта
|ГДЕ
| Пост.Ссылка В(&Ссылка)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Пост.ДоговорКонтрагента,
| Пост.Сделка,
| Пост.ДоговорКонтрагента.ВалютаВзаиморасчетов,
| КурсыВалютСрезПоследних.Курс,
| КурсыВалютСрезПоследних.Кратность,
| Пост.Ссылка,
| Пост.ДоговорКонтрагента.ВедениеВзаиморасчетов
|ИЗ
| Документ.ПоступлениеТоваровУслугВНТТ КАК Пост
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаКурса, ) КАК КурсыВалютСрезПоследних
| ПО Пост.ДоговорКонтрагента.ВалютаВзаиморасчетов = КурсыВалютСрезПоследних.Валюта
|ГДЕ
| Пост.Ссылка В(&Ссылка)");
Запрос.УстановитьПараметр("Ссылка" , МассивДокументов);
Запрос.УстановитьПараметр("ДатаКурса" , Период);
Возврат Запрос.Выполнить().Выбрать();
КонецФункции
Показать
Функция ПолучитьЗапросомМассивУзловПоОрганизацииДляОбменаУПП(Организация) Экспорт
Возврат ПроцедурыОбменаУПП.ПолучитьЗапросомМассивУзловПоОрганизации(Организация);
КонецФункции
Функция ПолучитьЗапросомМассивУзловПоОрганизацииДляОбменаУТУПП(Организация) Экспорт
Возврат ПроцедурыОбменаУТУПП.ПолучитьЗапросомМассивУзловПоОрганизации(Организация);
КонецФункции
Функция ПолучитьВыборкуПоКритериюОтбора(ИмяКритерияОтбора, ЗначениеКритерия) Экспорт
Запрос = Новый Запрос;
ТекстЗапроса = "";
Для Каждого ЭлементСостава ИЗ Метаданные.КритерииОтбора[ИмяКритерияОтбора].Состав Цикл
Если Не ЭлементСостава.Тип.СодержитТип(ТипЗнч(ЗначениеКритерия)) Тогда
Продолжить;
КонецЕсли;
ПутьКДанным = ЭлементСостава.ПолноеИмя();
СтруктураПутьКДанным = ОбщегоНазначения.РазобратьПутьКОбъектуМетаданных(ПутьКДанным, ЭлементСостава.Родитель());
ЕСли НЕ ПравоДоступа("Чтение", СтруктураПутьКДанным.Метаданные) Тогда
Продолжить;
КонецЕсли;
ИмяОбъекта = СтруктураПутьКДанным.ТипОбъекта + "." + СтруктураПутьКДанным.ВидОбъекта;
ПсевдонимТаблицы = СтруктураПутьКДанным.ТипОбъекта + "_" + СтруктураПутьКДанным.ВидОбъекта + "_" + СтруктураПутьКДанным.ИмяТаблЧасти;
ТекущаяСтрокаГДЕ = "ГДЕ " + ПсевдонимТаблицы + "." +СтруктураПутьКДанным.ИмяРеквизита + " = &ЗначениеКритерияОтбора";
ИмяТЧ = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);
ИмяРеквизита = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);
ТекстЗапроса = ТекстЗапроса + (?(ТекстЗапроса = "", "ВЫБРАТЬ", "ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ") + "
|" + ПсевдонимТаблицы + ".Ссылка ИЗ " + ИмяОбъекта + "." + СтруктураПутьКДанным.ИмяТаблЧасти + " КАК " + ПсевдонимТаблицы + "
|" + СтрЗаменить(ТекущаяСтрокаГДЕ, "..", ".") + "
|");
КонецЦикла;
Если ТекстЗапроса = "" Тогда
Возврат Новый ТаблицаЗначений;
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерия);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
// Возвращает текущий максимальный номер строки в наборе записей регистра
//
Функция МаксНомерСтрокиВНабореЗаписей(ИмяРегистра, Регистратор, ВидРегистра = "РегистрНакопления", УчитыватьДвиженияПартионногоУчета = Ложь) Экспорт
Запрос = Новый Запрос("ВЫБРАТЬ
| КОЛИЧЕСТВО(Рег.НомерСтроки) КАК МаксНомерСтроки
|ИЗ
|"+ВидРегистра+"." +ИмяРегистра+ " КАК Рег
|
|ГДЕ
| Рег.Регистратор = &Регистратор");
Если УчитыватьДвиженияПартионногоУчета тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"ГДЕ","ГДЕ Рег.СписаниеПартий = Ложь И");
КонецЕсли;
Запрос.УстановитьПараметр("Регистратор", Регистратор);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
МаксНомерСтроки = Выборка.МаксНомерСтроки;
Иначе
МаксНомерСтроки = 0;
КонецЕсли;
Возврат МаксНомерСтроки;
КонецФункции //МаксНомерСтрокиВНабореЗаписей
Показать
// Функция получает должность, подразделение и табельный номер сотрудника организации.
//
// Параметры
// ФизЛицо. - физ. лицо, для которго необходимо получить данные
// ДатаПериода - дата получения сведений
// Организация - организация, для которой необходимо получить данные
// Сотрудник - Сотрудник, для которго необходимо получить данные
//
// Возвращаемое значение:
// Структура с данными
//
Функция СведенияОСотруднике(ФизЛицо, ДатаПериода, Организация = Неопределено, Сотрудник = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаПериода", ДатаПериода);
Если НЕ ЗначениеЗаполнено(Организация) Тогда
// Для совместимости
Запрос.УстановитьПараметр("ФизЛицо", ФизЛицо);
Запрос.Текст =
"ВЫБРАТЬ
| Подразделение.Представление КАК Подразделение,
| Подразделение.Код КАК КодПодразделения,
| Должность.Представление КАК Должность
|ИЗ
| РегистрСведений.Работники.СрезПоследних(&ДатаПериода, ФизЛицо = &ФизЛицо)";
ИначеЕсли ЗначениеЗаполнено(Сотрудник) Тогда
// Если известен сотрудник, получим данные из регистра сведений "РаботникиОрганизаций"
Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &ДатаПериода
| И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| ТОГДА РаботникиОрганизацийСрезПоследних.ДолжностьЗавершения.Представление
| ИНАЧЕ РаботникиОрганизацийСрезПоследних.Должность.Представление
| КОНЕЦ КАК Должность,
| ВЫБОР
| КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &ДатаПериода
| И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения.Представление
| ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Представление
| КОНЕЦ КАК ПодразделениеОрганизации,
| ВЫБОР
| КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &ДатаПериода
| И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения.Код
| ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Код
| КОНЕЦ КАК КодПодразделения,
| РаботникиОрганизацийСрезПоследних.Сотрудник.Код КАК ТабельныйНомер
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаПериода, Сотрудник = &Сотрудник) КАК РаботникиОрганизацийСрезПоследних";
Иначе
// Если сотрудник не передан, тогда произведем поиск этого сотрудника в регистре сведений "РаботникиОрганизаций"
// по переданному физлицу и организации.
Запрос.УстановитьПараметр("ФизЛицо", ФизЛицо);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Работники.Сотрудник.Код КАК ТабельныйНомер,
| ВЫБОР
| КОГДА Работники.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| И Работники.ПериодЗавершения <= &ДатаПериода
| ТОГДА Работники.ПодразделениеОрганизацииЗавершения.Представление
| ИНАЧЕ Работники.ПодразделениеОрганизации.Представление
| КОНЕЦ КАК ПодразделениеОрганизации,
| ВЫБОР
| КОГДА Работники.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| И Работники.ПериодЗавершения <= &ДатаПериода
| ТОГДА Работники.ПодразделениеОрганизацииЗавершения.Код
| ИНАЧЕ Работники.ПодразделениеОрганизации.Код
| КОНЕЦ КАК КодПодразделения,
| ВЫБОР
| КОГДА Работники.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| И Работники.ПериодЗавершения <= &ДатаПериода
| ТОГДА Работники.ДолжностьЗавершения.Представление
| ИНАЧЕ Работники.Должность.Представление
| КОНЕЦ КАК Должность,
| ВЫБОР
| КОГДА Работники.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
| ТОГДА 0
| КОГДА Работники.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.Совместительство)
| ТОГДА 1
| ИНАЧЕ 2
| КОНЕЦ КАК Приоритет,
| Работники.Период КАК Период
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(
| &ДатаПериода,
| Сотрудник В
| (ВЫБРАТЬ
| СотрудникиОрганизаций.Ссылка
| ИЗ
| Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
| ГДЕ
| СотрудникиОрганизаций.Физлицо = &Физлицо
| И НЕ СотрудникиОрганизаций.ПометкаУдаления
| И СотрудникиОрганизаций.Организация = &Организация)) КАК Работники
|ГДЕ
| ВЫБОР
| КОГДА Работники.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| И Работники.ПериодЗавершения <= &ДатаПериода
| ТОГДА Работники.ПричинаИзмененияСостоянияЗавершения
| ИНАЧЕ Работники.ПричинаИзмененияСостояния
| КОНЕЦ <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
|
|УПОРЯДОЧИТЬ ПО
| Приоритет,
| Период УБЫВ";
КонецЕсли;
Результат = Новый Структура("ТабельныйНомер, ПодразделениеОрганизации, КодПодразделения, Должность");
ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
Если ВыборкаЗапроса.Следующий() Тогда
ЗаполнитьЗначенияСвойств(Результат, ВыборкаЗапроса);
Иначе
// Если в запросе ничего не нашли тогда вернем вместо табельного номера код физ.лица
Результат.ТабельныйНомер = ?(ЗначениеЗаполнено(ФизЛицо), ФизЛицо.Код, "");
КонецЕсли;
Возврат Результат;
КонецФункции // СведенияОСотруднике()
Показать
////////////////////////////////////////////////////////////////////////////////
// Подготовка структуры для заполнения шапки документа
//Функция проверяет наличие свойства в структуре по ключу, и его заполненность
// Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
//Параметры: СтруктураПараметров - проверяемая структура
// ИмяСвойства - строка, имя проверяемого свойства (ключ структуры)
//Возвращаемое значение - булево (Истина если свойство есть и оно заполнено)
Функция СвойствоЕстьИОноЗаполнено(ИмяСвойства, СтруктураПараметров)
Возврат СтруктураПараметров.Свойство(ИмяСвойства) И ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]);
КонецФункции
Показать
//Функция проверяет наличие свойства в структуре и его заполненность
// Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
//Параметры: СтруктураПараметров - проверяемая структура
// ИмяСвойства - строка, имя проверяемого свойства (ключ структуры)
//Возвращаемое значение - булево (Истина если свойство есть и оно НЕ заполнено)
Функция СвойствоЕстьИОноНЕЗаполнено(ИмяСвойства, СтруктураПараметров)
Возврат СтруктураПараметров.Свойство(ИмяСвойства) И НЕ ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]);
КонецФункции
Показать
//Процедура заполняет свойство в структуре значением по умолчанию
// Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
//Параметры: СтруктураПараметров - проверяемая структура
// ИмяСвойства - строка, имя проверяемого свойства (ключ структуры)
// ИмяНастройки - строка, имя настройки пользователя, по которой необходимо заполнить значение в структуре
// ЗаполнятьТолькоНезаполненные - булево, признак того что заполнять необходимо только если свойство еще не заполнено
Процедура ЗаполнитьСвойствоЗначениемПоУмолчанию(ИмяСвойства, ИмяНастройки, СтруктураПараметров, ЗаполнятьТолькоНезаполненные = Ложь)
// если нет такого свойства, то сразу уходим
Если НЕ СтруктураПараметров.Свойство(ИмяСвойства) Тогда
Возврат;
КонецЕсли;
//Если свойство заполнено, и необходимо заполнять только незаполненные свойства - ничего делать не надо
Если ЗаполнятьТолькоНезаполненные И ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]) Тогда
Возврат;
КонецЕсли;
СтруктураПараметров[ИмяСвойства] = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), ИмяНастройки);
КонецПроцедуры
Показать
//Процедура заполняет свойство в структуре значением по умолчанию. При этом проверяется, соответствует ли заполненное свойство организации.
// Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
//Параметры: СтруктураПараметров - обрабатываемая структура
// ИмяСвойства - строка, имя проверяемого свойства (ключ структуры)
// ИмяНастройки - строка, имя настройки пользователя, по которой необходимо заполнить значение в структуре
Процедура ЗаполнитьСвойствоЕслиОноСоответствуетОрганизации(ИмяСвойства, ИмяНастройки, СтруктураПараметров)
// имеет смысл, если только свойство есть
Если НЕ СтруктураПараметров.Свойство(ИмяСвойства) Тогда
Возврат;
КонецЕсли;
// если свойство не заполнено, то установим его в значение по умолчанию
Если НЕ ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]) Тогда
СтруктураПараметров[ИмяСвойства] = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), ИмяНастройки);
КонецЕсли;
// Если свойство установлено, Организация есть и установлена, и свойство не соответствует организации, то придется очистить свойство
Если ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства])
И СвойствоЕстьИОноЗаполнено("Организация", СтруктураПараметров)
И СтруктураПараметров[ИмяСвойства].Владелец <> СтруктураПараметров.Организация Тогда
СтруктураПараметров[ИмяСвойства] = Неопределено;
КонецЕсли;
КонецПроцедуры
Показать
//Процедура заполняет свойство в структуре банковским счетом владельца
// Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
// Параметры: СтруктураПараметров - обрабатываемая структура
// ИмяСвойства - строка, имя проверяемого заполняемого (ключ структуры)
// ИмяВладельца: строка, имя свойства содержащего владельца банковского счета ("Организация" или "Контрагент")
Процедура ЗаполнитьСвойствоБанковскимСчетомВладельца(ИмяСвойства, ИмяВладельца, СтруктураПараметров)
// Перед вызовом процедуры проверяется, что Владелец есть и он заполнен.
//Поэтому внутри процедуры свойство ИмяВладельца на заполненность не проверяется
// имеет смысл, если только свойство есть
Если НЕ СтруктураПараметров.Свойство(ИмяСвойства) Тогда
Возврат;
КонецЕсли;
// если свойство не заполнено, то заполнить по Владельцу
Если НЕ ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]) Тогда
СтруктураПараметров[ИмяСвойства] = СтруктураПараметров[ИмяВладельца].ОсновнойБанковскийСчет;
// Свойство заполнено, значит надо проверить, соответствует ли оно Владельцу (что Владелец есть и он установлен, мы проверили до вызова процедуры)
ИначеЕсли СтруктураПараметров[ИмяСвойства].Владелец <> СтруктураПараметров[ИмяВладельца] Тогда
// Если свойство не соответствует Владельцу, то следует очистить его
СтруктураПараметров[ИмяСвойства] = Неопределено;
КонецЕсли;
КонецПроцедуры
Показать
// Процедура предназначена для заполнения общих реквизитов документов,
// вызывается из процедуры ЗаполнитьШапкуДокумента.
//
// СтруктураПараметров - структура параметров для заполнения, содержит реквизиты шапки заполняемого документа,
// ТипОперации - строка вида операции ("Покупка", "Продажа", "ПокупкаКомиссия", "ПродажаКомиссия"),
// если передана пустая строка, то реквизиты, зависящие от вида операции, не заполняются,
// ОбъектКопирования - ссылка на объект, с которого скопирован заполняемый документ,
//
Процедура ПодготовитьСтруктуруДляЗаполненияШапкиДокумента(СтруктураПараметров, ТипОперации, ОбъектКопирования) Экспорт
ТекПользователь = глЗначениеПеременной("глТекущийПользователь");
ЗаполнитьСвойствоЗначениемПоУмолчанию("Ответственный", "ОсновнойОтветственный", СтруктураПараметров);
ЗаполнитьСвойствоЗначениемПоУмолчанию("Организация", "ОсновнаяОрганизация", СтруктураПараметров, Истина);
// Заполним флаги принадлежности к учету исходя из значений по умолчанию.
ЗаполнитьСвойствоЗначениемПоУмолчанию("ОтражатьВУправленческомУчете", "ОтражатьДокументыВУправленческомУчете", СтруктураПараметров);
Если СтруктураПараметров.Свойство("Организация") И СтруктураПараметров.Свойство("ОтражатьВБухгалтерскомУчете") Тогда
//Если Организация заполнена, и отражается в регл. учете - флаг отражения в БУ устанавливается из настроек пользователя
Если ЗначениеЗаполнено(СтруктураПараметров.Организация) И СтруктураПараметров.Организация.ОтражатьВРегламентированномУчете Тогда
СтруктураПараметров.ОтражатьВБухгалтерскомУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ТекПользователь, "ОтражатьДокументыВБухгалтерскомУчете");
Если СтруктураПараметров.Свойство("ОтражатьВНалоговомУчете") Тогда
Если СтруктураПараметров.ОтражатьВБухгалтерскомУчете Тогда
//флаг может устанавливаться только если установлено отражение в БУ
СтруктураПараметров.ОтражатьВНалоговомУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ТекПользователь, "ОтражатьДокументыВНалоговомУчете");
Иначе
СтруктураПараметров.ОтражатьВНалоговомУчете = Ложь;
КонецЕсли;
КонецЕсли;
Иначе
СтруктураПараметров.ОтражатьВБухгалтерскомУчете = Ложь;
Если СтруктураПараметров.Свойство("ОтражатьВНалоговомУчете") Тогда
СтруктураПараметров.ОтражатьВНалоговомУчете = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли; //Если СтруктураПараметров.Свойство("Организация") И СтруктураПараметров.Свойство("ОтражатьВБухгалтерскомУчете") Тогда
// Определяем дату для вычисления периода регистрации, курса валюты и учетной политики (используется ниже)
ДатаДокумента = ?(НЕ ЗначениеЗаполнено(СтруктураПараметров.Дата),ОбщегоНазначения.ПолучитьРабочуюДату(),СтруктураПараметров.Дата);
Если СтруктураПараметров.Свойство("ПериодРегистрации") Тогда
СтруктураПараметров.ПериодРегистрации = НачалоМесяца(ДатаДокумента);
КонецЕсли;
//если документ скопирован - другие реквизиты шапки не заполняем
Если ОбъектКопирования <> Неопределено Тогда
Возврат;
КонецЕсли;
Показать
ЗаполнитьСвойствоЗначениемПоУмолчанию("Подразделение", "ОсновноеПодразделение", СтруктураПараметров, И
17.
solodovnikov.84
1112.09.19 14:15 Сейчас в теме
(14)По хорошему надо смотреть в конфигураторе,какие данные в тот момент обрабатываются.А что за конфигурация 1с?Постгри нормальный,сам собираюсь на днях переходить на него.Правда качал конфу постгри с сайта рекомендованного 1с.
26.
user-programmist
413.09.19 13:16 Сейчас в теме
(1) А не пробовали запускать, когда в базе нет никого из пользователей кроме вас? Или именно тех, кто может одновременно с вами в один регистр пытаться записать что-то?
Всем привет! У меня такая же проблема, появилась недавно. Конфигурация УПП релиз 1.3.130.2. Бухгалтера стали жаловаться на долгое проведение документов. Раньше проведение занимало 3-5 сек, теперь 30-40 сек. Дальше начали выпадать ошибки:
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.УправлениеЗапасамиПартионныйУчет.Модуль(9820)}: Ошибка при вызове метода контекста (Выполнить)
по причине:
Ошибка выполнения запроса
по причине:
Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 10.0: Транзакция (идентификатор процесса 52) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.
HRESULT=80004005, SQLSrvr: SQLSTATE=40001, state=33, Severity=D, native=1205, line=1
Строка общего модуля УправлениеЗапасамиПартионныйУчет функция ПолучитьДеревоПартийНаСкладахУпр:
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.ПолныеПрава.Модуль(1283)}: Ошибка при вызове метода контекста (Записать)
по причине:
Конфликт блокировок при выполнении транзакции:
Превышено максимальное время ожидания предоставления блокировки
Строка общего модуля ПолныеПрава процедура ЗаписатьНаборЗаписейНаСервере:
Набор.Записать();
P.S. Выгонял всех пользователей из базы и проводил документы, результат тот же 30-40 минут проведения. НО! Если сделать бэкап и залить его в новую базу, всё начинает работать быстрее. Документы проводятся 3-5 сек.
подкидуюю условие для проверки чтоб пустой набор по хозрасчетному не записался тогда ошибка не выскакивает и дает параллельно работать проблема в Хозрасчетном как ее решить вопрос
Если ИмяРегистра = "Хозрасчетный" Тогда
Возврат;
Конецесли;
Набор = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей();
ИначеЕсли ТипРегистра = "РегистрСведений" Тогда
Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
ИначеЕсли ТипРегистра = "РегистрРасчета" Тогда
Набор = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей();
КонецЕсли;
Если ТаблицаДвижений <> Неопределено Тогда
Набор.Загрузить(ТаблицаДвижений);
КонецЕсли;
КонецЕсли;
Набор.Отбор.Регистратор.Установить(Регистратор);
Набор.Записать()
(36) Сегодня в 1С:Комплексная автоматизация 2 (2.5.16.68) посыпалась куча ошибок "Конфликт блокировок при выполнении транзакции". В одной из ошибок увидел упоминание расширения EF_00_00596270. В нём переписана процедура ВыполнитьВыгрузкуЗарегистрированныхДанных в общем модуле ОбменДаннымиXDTOСервер. Снял галочку "Активность" с расширения и ошибки прекратились.