1. user867197 12.09.19 10:31 Сейчас в теме

Выходит ошибка в 1с. Конфликт блокировок при выполнении транзакции

Выходит ошибка в 1с. Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки. Если не выходит ошибка, то медленно проводит накладные секунд 20 каждую.

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.ПолныеПрава.Модуль(1283)}: Ошибка при вызове метода контекста (Записать)
Сервер Intel Xeon E312xx(SandyBridge) 2.5 ОЗУ 28 SSD СУБД Postgree Pro 11.4.1 база весит 30 гигов
Прикрепленные файлы:
postgresql.conf
postgresql-2019-09-12_093956.log
Ответы
Избранное Подписка Сортировка: Древо
2. solodovnikov.84 11 12.09.19 11:20 Сейчас в теме
(1) Много пользователей работает?Перегружать сервер пробовали?
3. user867197 12.09.19 11:26 Сейчас в теме
4. solodovnikov.84 11 12.09.19 12:00 Сейчас в теме
(3)Судя по логам,вы загружаете какой то объект и при записи с использованием общих реквизитов,он у вас выдает ошибку.Пробовали перезапускать службы сервера?Конечно хорошо бы по мониторить,конкретно на что он ругается,и в случае не надобности исключить этот реквизит.На худой конец можно отключить блокировки.Но надо этим нужно подумать.

https://infostart.ru/public/91880/
5. user867197 12.09.19 12:08 Сейчас в теме
(4) службы перезапускал postgree и 1с
7. solodovnikov.84 11 12.09.19 12:10 Сейчас в теме
(5)Ну как вариант попробуйте переключить на управляемые блокировки.
Как тут написано https://wiseadvice-it.ru/o-kompanii/blog/articles/konflikt-blokirovok-pri-vypolnenii-tranzakcii-v-1s/

Но в идеале,нужно посадить программиста,что бы он отловил реквизит или объект который используется одновременно и вашей загрузкой и кем то еще.
8. user867197 12.09.19 12:22 Сейчас в теме
(7)не управлямые не буду включать((
9. solodovnikov.84 11 12.09.19 12:59 Сейчас в теме
(8)Я бы тоже не стал.А так нужно садить программера,А что хоть за конфа и что за процесс который записать вызывает?
10. user867197 12.09.19 13:16 Сейчас в теме
11. user867197 12.09.19 13:19 Сейчас в теме
(9) Комплексная автоматизация, редакция 1.1 (1.1.115.1) (http://v8.1c.ru/ka/)
Copyright (С) ООО "1C-Софт", 2010-2018. Все права защищены
(http://www.1c.ru/)
1С:Предприятие 8.3 (8.3.13.1809)

платежные поступления
12. user867197 12.09.19 13:34 Сейчас в теме
(9) _AccRg<n> - таблица движений регистра бухгалтерии. на него ругается вроде, если сделать реиндексацию и реструктуризацияю в 1с поможет?
13. solodovnikov.84 11 12.09.19 13:56 Сейчас в теме
(12)Реиндексация и реструктуризация думаю не поможет.По всей видимости при записи в этот регистр с работой других пользователей и ругается.А пробовали этот процесс запускать,когда в базе никто не работает?
14. user867197 12.09.19 14:01 Сейчас в теме
(13) когда бухгалтер не проводит, а проводит кассир проводится но медленно
_AccRgAT0<n>» - таблица итогов (остатки и обороты) по счету в целом. Эта таблице хранит итоги по всем счетам (которые имеют субконто и которые не имеют) и состоит из следующих полей:
состоит из следующих полей:
Счет учета (_AccountRRef)
накладные и платежные поступления используют один 62 счет на него наверно ругается
15. solodovnikov.84 11 12.09.19 14:10 Сейчас в теме
(14)Возможно.Но не факт,что это счет.Может быть любой реквизит.Или сама запись в целом.Например когда бухгатер сохраняет свой документ и вы загружаете,мол записи одновременно не сохраняются.
16. solodovnikov.84 11 12.09.19 14:12 Сейчас в теме
(14)Конфа дописанная?Права у бухгалтера,который работает одновременно полные?
18. user867197 12.09.19 14:17 Сейчас в теме
(16) дописаная нет не полные
20. solodovnikov.84 11 12.09.19 14:26 Сейчас в теме
(18)Просто хотел посмотреть,что за строка в полных правах ОбщийМодуль.ПолныеПрава.Модуль(1283).И что за конфа 1с?БП,упп,ерп?
21. user867197 12.09.19 14:28 Сейчас в теме
22. user867197 12.09.19 14:28 Сейчас в теме
23. user867197 12.09.19 14:35 Сейчас в теме
(20)как узнать на строке

// Сохранение в параметре сеанса ГраницыЗапретаИзмененияДанных границ запрета изменений данных
Процедура УстановитьПараметрГраницыЗапретаИзмененияДанных() Экспорт
		
	Если РольДоступна("ПолныеПрава") И НЕ Константы.ПрименятьДатуЗапретаДляПолныхПрав.Получить() Тогда
		ПараметрыСеанса.ГраницыЗапретаИзмененияДанных = Новый ХранилищеЗначения(Неопределено, Новый СжатиеДанных(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)
		|					И Работники.ПериодЗавершения <= &ДатаПериода
		|				ТОГДА Работники.ПричинаИзмененияСостоянияЗавершения
		|			ИНАЧЕ Работники.ПричинаИзмененияСостояния
		|		КОНЕЦ <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
		|
		|УПОРЯДОЧИТЬ ПО
		|	Приоритет,
		|	Период УБЫВ";
		
	КонецЕсли; 	
	
	Результат 	   = Новый Структура("ТабельныйНомер, ПодразделениеОрганизации, КодПодразделения, Должность");
	ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
	
	Если ВыборкаЗапроса.Следующий() Тогда
		ЗаполнитьЗначенияСвойств(Результат, ВыборкаЗапроса);
	Иначе
		// Если в запросе ничего не нашли тогда вернем вместо табельного номера код физ.лица
		Результат.ТабельныйНомер = ?(ЗначениеЗаполнено(ФизЛицо), ФизЛицо.Код, "");
	КонецЕсли; 
	
	Возврат Результат;
	
КонецФункции // СведенияОСотруднике()
Показать


////////////////////////////////////////////////////////////////////////////////
// Подготовка структуры для заполнения шапки документа

//Функция проверяет наличие свойства в структуре по ключу, и его заполненность
//	Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
//Параметры: СтруктураПараметров - проверяемая структура
//			ИмяСвойства - строка, имя проверяемого свойства (ключ структуры)
//Возвращаемое значение - булево (Истина если свойство есть и оно заполнено)
Функция СвойствоЕстьИОноЗаполнено(ИмяСвойства, СтруктураПараметров)
	
	Возврат СтруктураПараметров.Свойство(ИмяСвойства) И ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]);

КонецФункции
Показать


//Функция проверяет наличие свойства в структуре и его заполненность
//	Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
//Параметры: СтруктураПараметров - проверяемая структура
//			ИмяСвойства - строка, имя проверяемого свойства (ключ структуры)
//Возвращаемое значение - булево (Истина если свойство есть и оно НЕ заполнено)
Функция СвойствоЕстьИОноНЕЗаполнено(ИмяСвойства, СтруктураПараметров)
	
	Возврат СтруктураПараметров.Свойство(ИмяСвойства) И НЕ ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]);

КонецФункции
Показать


//Процедура заполняет свойство в структуре значением по умолчанию
//	Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
//Параметры: СтруктураПараметров - проверяемая структура
//			ИмяСвойства - строка, имя проверяемого свойства (ключ структуры)
//			ИмяНастройки - строка, имя настройки пользователя, по которой необходимо заполнить значение в структуре
//			ЗаполнятьТолькоНезаполненные - булево, признак того что заполнять необходимо только если свойство еще не заполнено
Процедура ЗаполнитьСвойствоЗначениемПоУмолчанию(ИмяСвойства, ИмяНастройки, СтруктураПараметров, ЗаполнятьТолькоНезаполненные = Ложь)
	// если нет такого свойства, то сразу уходим
	Если НЕ СтруктураПараметров.Свойство(ИмяСвойства) Тогда 
		Возврат; 
	КонецЕсли;
	
	//Если свойство заполнено, и необходимо заполнять только незаполненные свойства - ничего делать не надо
	Если ЗаполнятьТолькоНезаполненные И ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]) Тогда
		Возврат;
	КонецЕсли;
		
	СтруктураПараметров[ИмяСвойства] = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), ИмяНастройки);
КонецПроцедуры
Показать


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

	// если свойство не заполнено, то установим его в значение по умолчанию 
	Если НЕ ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]) Тогда
		СтруктураПараметров[ИмяСвойства] = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), ИмяНастройки);
	КонецЕсли;
	
	// Если свойство установлено, Организация есть и установлена, и свойство не соответствует организации, то придется очистить свойство
	Если ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]) 
			И СвойствоЕстьИОноЗаполнено("Организация", СтруктураПараметров) 
			И СтруктураПараметров[ИмяСвойства].Владелец <> СтруктураПараметров.Организация Тогда
		СтруктураПараметров[ИмяСвойства] = Неопределено;
	КонецЕсли;
		
КонецПроцедуры
Показать


//Процедура заполняет свойство в структуре банковским счетом владельца
//	Вызывается из процедуры ПодготовитьСтруктуруДляЗаполненияШапкиДокумента
// Параметры: СтруктураПараметров - обрабатываемая структура
//			ИмяСвойства - строка, имя проверяемого заполняемого (ключ структуры)
//			ИмяВладельца: строка, имя свойства содержащего владельца банковского счета ("Организация" или "Контрагент")
Процедура ЗаполнитьСвойствоБанковскимСчетомВладельца(ИмяСвойства, ИмяВладельца, СтруктураПараметров)
	// Перед вызовом процедуры проверяется, что Владелец есть и он заполнен. 
	//Поэтому внутри процедуры свойство ИмяВладельца на заполненность не проверяется

	// имеет смысл, если только свойство есть 
	Если НЕ СтруктураПараметров.Свойство(ИмяСвойства) Тогда
		Возврат;
	КонецЕсли;
	
	// если свойство не заполнено, то заполнить по Владельцу
	Если НЕ ЗначениеЗаполнено(СтруктураПараметров[ИмяСвойства]) Тогда
		
		СтруктураПараметров[ИмяСвойства] = СтруктураПараметров[ИмяВладельца].ОсновнойБанковскийСчет;
		
	// Свойство заполнено, значит надо проверить, соответствует ли оно Владельцу (что Владелец есть и он установлен, мы проверили до вызова процедуры)
	ИначеЕсли СтруктураПараметров[ИмяСвойства].Владелец <> СтруктураПараметров[ИмяВладельца] Тогда
		// Если свойство не соответствует Владельцу, то следует очистить его
		СтруктураПараметров[ИмяСвойства] = Неопределено;
		
	КонецЕсли;
		
КонецПроцедуры
Показать


// Процедура предназначена для заполнения общих реквизитов документов,
// вызывается из процедуры ЗаполнитьШапкуДокумента.
//
//  СтруктураПараметров				- структура параметров для заполнения, содержит реквизиты шапки заполняемого документа,
//  ТипОперации						- строка вида операции ("Покупка", "Продажа", "ПокупкаКомиссия", "ПродажаКомиссия"),
//										если передана пустая строка, то реквизиты, зависящие от вида операции, не заполняются,
//  ОбъектКопирования				- ссылка на объект, с которого скопирован заполняемый документ,
//
Процедура ПодготовитьСтруктуруДляЗаполненияШапкиДокумента(СтруктураПараметров, ТипОперации, ОбъектКопирования) Экспорт
	ТекПользователь = глЗначениеПеременной("глТекущийПользователь");
	
	ЗаполнитьСвойствоЗначениемПоУмолчанию("Ответственный", "ОсновнойОтветственный", СтруктураПараметров);
	ЗаполнитьСвойствоЗначениемПоУмолчанию("Организация", "ОсновнаяОрганизация", СтруктураПараметров, Истина);
	
	// Заполним флаги принадлежности к учету исходя из значений по умолчанию.
	ЗаполнитьСвойствоЗначениемПоУмолчанию("ОтражатьВУправленческомУчете", "ОтражатьДокументыВУправленческомУчете", СтруктураПараметров);

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

	Если СтруктураПараметров.Свойство("ПериодРегистрации") Тогда
		СтруктураПараметров.ПериодРегистрации = НачалоМесяца(ДатаДокумента);
	КонецЕсли;

	//если документ скопирован - другие реквизиты шапки не заполняем
	Если ОбъектКопирования <> Неопределено Тогда
		Возврат;
	КонецЕсли;
Показать


ЗаполнитьСвойствоЗначениемПоУмолчанию("Подразделение", "ОсновноеПодразделение", СтруктураПараметров, И
24. user867197 12.09.19 14:38 Сейчас в теме
(23) Набор.Записать(); 1283 строка
25. solodovnikov.84 11 12.09.19 16:17 Сейчас в теме
(24)А что за процесс в котором эта ошибка происходит?И под каким пользователем она происходит?
17. solodovnikov.84 11 12.09.19 14:15 Сейчас в теме
(14)По хорошему надо смотреть в конфигураторе,какие данные в тот момент обрабатываются.А что за конфигурация 1с?Постгри нормальный,сам собираюсь на днях переходить на него.Правда качал конфу постгри с сайта рекомендованного 1с.
19. user867197 12.09.19 14:18 Сейчас в теме
(17)1С:Предприятие 8.3 (8.3.13.1809)
Комплексная автоматизация, редакция 1.1 (1.1.115.1) (http://v8.1c.ru/ka/)
Copyright (С) ООО "1C-Софт", 2010-2018. Все права защищены
(http://www.1c.ru/)
6. user867197 12.09.19 12:10 Сейчас в теме
(4)конфиг постгрее нормальный?
26. user-programmist 1 13.09.19 13:16 Сейчас в теме
(1) А не пробовали запускать, когда в базе нет никого из пользователей кроме вас? Или именно тех, кто может одновременно с вами в один регистр пытаться записать что-то?
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Екатеринбург
зарплата от 120 000 руб. до 120 000 руб.
Полный день

Бизнес-аналитик 1С
Москва
зарплата от 140 000 руб. до 200 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день


Программисты 1С УТ / БУЗ/ЗУП / БИТ ФИНАНС
Москва
зарплата от 100 000 руб. до 180 000 руб.
Полный день