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 2 13.09.19 13:16 Сейчас в теме
(1) А не пробовали запускать, когда в базе нет никого из пользователей кроме вас? Или именно тех, кто может одновременно с вами в один регистр пытаться записать что-то?
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

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

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

Консультант-аналитик 1С
Набережные Челны
зарплата до 90 000 руб.
Полный день

Программист 1С
Набережные Челны
зарплата от 40 000 руб. до 110 000 руб.
Полный день