1с ошибка временная таблица

0 / 0 / 0

Регистрация: 18.09.2021

Сообщений: 13

1

Временная таблица уже существует

12.11.2021, 01:45. Показов 2934. Ответов 7


Студворк — интернет-сервис помощи студентам

Добрый день. Возникла такая проблема. Проверил в коде — повторяющихся запросов нет. Как можно решить проблему, пожалуйста?

Код

{Документ.ОказаниеУслуги.МодульОбъекта(34)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(6, 11)}: Временная таблица уже существует "НоменклатураДокумента"
ПОМЕСТИТЬ <<?>>НоменклатураДокумента

Сам модуль

Кликните здесь для просмотра всего текста

Код

Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина; Движения.Продажи.Записывать = Истина;

//Создать менеджер временных таблиц.
МенеджерВТ = Новый
МенеджерВременныхТаблиц;

Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Запрос = Новый Запрос;
//Укажем, какой менеджер временных таблиц использует этот запрос
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура КАК Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";

Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

Запрос2 = Новый Запрос; Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура КАК Номенклатура,
| НоменклатураДокумента.ВидНоменклатуры КАК ВидНоменклатуры,
| НоменклатураДокумента.СуммаВДокументе КАК СуммаВДокументе,
| НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
| ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
| ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
|ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
| ,
| Материал В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
| ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
| ,
| Материал В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
| ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";
//Установим необходимость блокировки данных в регистрах СтоимостьМатериалов и ОстаткиМатериалов.
Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;
Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;

//Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе.
Движения.СтоимостьМатериалов.Записать();
Движения.ОстаткиМатериалов.Записать();

РезультатЗапроса = Запрос2.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
СтоимостьМатериала = 0;
Иначе
СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость/ВыборкаДетальныеЗаписи.Количество;
КонецЕсли;

Если ВыборкаДетальныеЗаписи.Номенклатура.ВидНоменклатуры =
Перечисления.ВидыНоменклатуры.Материал Тогда
// регистр ОстаткиМатериалов Расход
Движение = Движения.ОстаткиМатериалов.Добавить(); Движение.ВидДвижения =
ВидДвиженияНакопления.Расход; Движение.Период = Дата;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
// регистр СтоимостьМатериалов Расход
Движение = Движения.СтоимостьМатериалов.Добавить(); Движение.ВидДвижения
= ВидДвиженияНакопления.Расход; Движение.Период = Дата;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Стоимость =
ВыборкаДетальныеЗаписи.КоличествоВДокументе*СтоимостьМатериала;
КонецЕсли;

КонецЦикла;

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


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



0



1561 / 991 / 378

Регистрация: 31.05.2012

Сообщений: 3,502

12.11.2021, 07:27

2

У тебя же в цикле создание временной таблицы с одним и тем же менеджером временных таблиц



0



1193 / 732 / 211

Регистрация: 22.04.2013

Сообщений: 5,380

Записей в блоге: 1

12.11.2021, 08:13

3

Аватар, а я чот не увидел



0



1561 / 991 / 378

Регистрация: 31.05.2012

Сообщений: 3,502

12.11.2021, 08:41

4

Цитата
Сообщение от Yulunga
Посмотреть сообщение

а я чот не увидел

смотрю в книгу вижу фигу )

Цитата
Сообщение от kyanu
Посмотреть сообщение

Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл



0



1897 / 1301 / 461

Регистрация: 16.01.2015

Сообщений: 5,656

12.11.2021, 09:11

5

kyanu, Во наворочено! Это по какой методичке делал?
Скажи, зачем первые два запроса да еще в цикле? Обработка проведения делается в модуле объекта.Зачем получать номенклатуру, помещать в ВТ и потом мучить эту ВТ. Не проще запрос к ТЧ проводимого документа сразу с левым соединением к регистру остатки (ну если у тебя нет регистра себестоимости)? Получишь тот же результат, но без ВТ и цикла



0



Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

13.11.2021, 01:12

6

Цитата
Сообщение от kyanu
Посмотреть сообщение

//Создать менеджер временных таблиц.
МенеджерВТ = Новый
МенеджерВременныхТаблиц;

Нафига его использовать вообще?!? (особенно если пользоваться не умеешь) ?

Добавлено через 1 минуту
Понимаю еще если выполнил запрос и его нужно передать КУДА-ТО еще, в другое событие и т.д.
Но в одной процедуре то зачем?!!?
И опять же это нужно лишь для увеличения быстродействия!



0



K_Serhii

2 / 2 / 0

Регистрация: 21.07.2018

Сообщений: 35

13.11.2021, 16:52

7

первый запрос: «ПОМЕСТИТЬ НоменклатураДокумента»
второй запрос: «ИЗ НоменклатураДокумента КАК НоменклатураДокумента»
Ошибка так как ты псевдоним «НоменклатураДокумента» уже занято!

Попробуй в первом запросе дать другое имя (например добавить 1) «ПОМЕСТИТЬ НоменклатураДокумента1»
тогда во втором запросе выбирай из нового псевдонима «ИЗ НоменклатураДокумента1 КАК НоменклатураДокумента»

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина; Движения.Продажи.Записывать = Истина;
 
//Создать менеджер временных таблиц.
МенеджерВТ = Новый
МенеджерВременныхТаблиц;
 
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
 
Запрос = Новый Запрос;
//Укажем, какой менеджер временных таблиц использует этот запрос
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура КАК Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ПОМЕСТИТЬ НоменклатураДокумента1 // Добавил 1 тут
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";
 
Запрос.УстановитьПараметр("Ссылка", Ссылка);
 
РезультатЗапроса = Запрос.Выполнить();
 
Запрос2 = Новый Запрос; Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура КАК Номенклатура,
| НоменклатураДокумента.ВидНоменклатуры КАК ВидНоменклатуры,
| НоменклатураДокумента.СуммаВДокументе КАК СуммаВДокументе,
| НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
| ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
| ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
|ИЗ
| НоменклатураДокумента1 КАК НоменклатураДокумента // Добавил 1 тут
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
| ,
| Материал В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
| ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
| ,
| Материал В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
| ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";
//Установим необходимость блокировки данных в регистрах СтоимостьМатериалов и ОстаткиМатериалов.
Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;
Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;



0



1897 / 1301 / 461

Регистрация: 16.01.2015

Сообщений: 5,656

13.11.2021, 17:48

8

Цитата
Сообщение от K_Serhii
Посмотреть сообщение

первый запрос: «ПОМЕСТИТЬ НоменклатураДокумента»
второй запрос: «ИЗ НоменклатураДокумента КАК НоменклатураДокумента»
Ошибка так как ты псевдоним «НоменклатураДокумента» уже занято!

Не прав. Во втором запросе он обращается к ВТ НоменклатураДокумента переданного с помощью МВТ во второй.
Ему в принципе не нужны ни МВТ ни ВТ в этом и ошибка



0



  

cfk

02.12.15 — 14:36

тзДанные77  = Новый ТаблицаЗначений;                

            мт             = Новый Массив;

            мт.Добавить(Тип(«Строка»));          

            мт.Добавить(Тип(«Дата»));          

            мт.Добавить(Тип(«Число»));          

            отСтрока     = Новый ОписаниеТипов(мт,,,

                Новый КвалификаторыЧисла(9,2,ДопустимыйЗнак.Любой),

                Новый КвалификаторыСтроки(25,ДопустимаяДлина.Переменная),

                Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя),);

            

            стрКолонки     = Новый Структура(«Документ,Период,Организация,ОрганизацияКлюч,»

                +»Склад,СкладКлюч,Контрагент,КонтрагентКлюч,Сумма»);                

            Для каждого киз Из стрКолонки Цикл

                тзДанные77.Колонки.Добавить(киз.Ключ,отСтрока);

            КонецЦикла;

            

            Пока РН77.ПолучитьДокумент()=1 Цикл

                Если РН77.Проведен()=1 Тогда

                    стз = тзДанные77.Добавить();

                    стз.Документ         = РН77.НомерДок;

                    стз.Период             = РН77.ДатаДок;

                    стз.Организация     = РН77.Фирма.Наименование;

                    стз.ОрганизацияКлюч = РН77.Фирма.Код;

                    стз.Склад             = РН77.МестоХранения.Наименование;

                    стз.СкладКлюч         = РН77.МестоХранения.Код;

                    стз.Контрагент        = РН77.Контрагент.Наименование;

                    стз.КонтрагентКлюч    = РН77.Контрагент.Код;

                    стз.Сумма             = РН77.Итог(«СуммаСНДС»);

                КонецЕсли;                

                 //Сообщить(«Документ <«+РН77.НомерДок

                 //    +»> от <«+РН77.ДатаДок

                 //    +»>Фирма <«+РН77.Фирма.Наименование

                 //    +»> Контрагент <«+РН77.Контрагент.Наименование

                 //    +»> Сумма <«+РН77.Итог(«СуммаСНДС»)

                 //   +»> Проведен <«+РН77.Проведен()

                 //   +»>»);                                  

            КонецЦикла;

                

               З = Новый Запрос;            

               мвт = Новый МенеджерВременныхТаблиц;

               З.МенеджерВременныхТаблиц = мвт;                        

            З.УстановитьПараметр(«тзДанные77»,тзДанные77);

                        

            З.Текст = »                

                |ВЫБРАТЬ

                |    тзДанные77.Организация,

                |    тзДанные77.ОрганизацияКлюч,

                |    тзДанные77.Склад,

                |    тзДанные77.СкладКлюч,

                |    тзДанные77.Контрагент,

                |    тзДанные77.КонтрагентКлюч,

                |    тзДанные77.Документ,

                |    тзДанные77.Период,

                |    тзДанные77.Сумма

                |ПОМЕСТИТЬ Данные77

                |ИЗ

                |    &тзДанные77 КАК тзДанные77

                |;

                |

                |////////////////////////////////////////////////////////////////////////////////

                |ВЫБРАТЬ

                |    Данные77.Организация,

                |    Данные77.ОрганизацияКлюч КАК Ключ,

                |    МАКСИМУМ(Организации.Ссылка) КАК Ссылка

                |ИЗ

                |    Данные77 КАК Данные77

                |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации

                |        ПО Данные77.ОрганизацияКлюч = Организации.Ключ

                |

                |СГРУППИРОВАТЬ ПО

                |    Данные77.Организация,

                |    Данные77.ОрганизацияКлюч

                |

                |ИМЕЮЩИЕ

                |    МАКСИМУМ(Организации.Ссылка) ЕСТЬ NULL «;

            рз = З.Выполнить();

  

cfk

1 — 02.12.15 — 14:37

{Обработка.Импорт.Форма.Форма.Форма(141)}: Ошибка при вызове метода контекста (Выполнить): {(12, 11)}: Временная таблица уже существует "Данные77"
ПОМЕСТИТЬ <<?>>Данные77

  

ДенисЧ

2 — 02.12.15 — 14:39

второй раз вызываешь без обнуления переменных…

  

cfk

3 — 02.12.15 — 14:39

(1)нет

  

Nuobu

4 — 02.12.15 — 14:40

(1) Отладкой делаешь З.Выполнить(), смотришь результат.

А как оно само доходит до этой строчки, то падает.

  

cfk

5 — 02.12.15 — 14:40

тоесть (2) нет =) С первого раза выскакивает. А менеджер в исключении закрывается

  

VikingKosmo

6 — 02.12.15 — 14:40

(4) 300%

  

cfk

7 — 02.12.15 — 14:41

(4) не понял, чем будет отличаться отладка от рантайма в данном случае

  

Nuobu

8 — 02.12.15 — 14:41

(7) Сделай без отладки.

  

VikingKosmo

9 — 02.12.15 — 14:41

(7) тем, что в рантайм не будет повторного создания ВТ

  

cfk

10 — 02.12.15 — 14:43

(8,9) где вы видите повторное создание. С ПЕРВОГО раза выскакивает, говорю вам. и Менеджер временных таблиц закрывается каждый раз при исключении. Т.е. временные таблицы после каждого исключения уничтожаются.

  

cfk

11 — 02.12.15 — 14:45

(8), (9) так понятнее?

Попытка                

        v77 = Новый COMОбъект("V77.Application");                  Dir = стрПар.Каталог;         Usr = стрПар.Пользователь;         Pwd = стрПар.Пароль;                  ConnStr = "/D"""+Dir+""""             +" /N"""+Usr+""""+                         ?(StrLen(TrimAll(Pwd))<>0," /P"""+Pwd+""" ","");          //        Сообщить("Подключаюcь как <"+Usr+"> к <"+Dir+">");                   Если v77.Initialize(v77.RMTrade,TrimAll(ConnStr),"NO_SPLASH_SHOW") = 0 Тогда             ВызватьИсключение("Сбой подключения к <"+Dir+">");         КонецЕсли;          //        Сообщить("Успешно подключена база <"+Dir+">");                   Период = стрПар.Период;                  РН77 = v77.CreateObject("Документ.РасходнаяНакладная");         Если РН77.ВыбратьДокументы(Период.ДатаНачала,Период.ДатаОкончания) = 1 Тогда                          тзДанные77  = Новый ТаблицаЗначений;                             мт            = Новый Массив;             мт.Добавить(Тип("Строка"));                       мт.Добавить(Тип("Дата"));                       мт.Добавить(Тип("Число"));                       отТипы    = Новый ОписаниеТипов(мт,,,                 Новый КвалификаторыЧисла(9,2,ДопустимыйЗнак.Любой),                 Новый КвалификаторыСтроки(25,ДопустимаяДлина.Переменная),                 Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя),);                          стрКолонки    = Новый Структура("Документ,Период,Организация,ОрганизацияКлюч,"                 +"Склад,СкладКлюч,Контрагент,КонтрагентКлюч,Сумма");                             Для каждого киз Из стрКолонки Цикл                 тзДанные77.Колонки.Добавить(киз.Ключ,отТипы);             КонецЦикла;                          Пока РН77.ПолучитьДокумент()=1 Цикл                 Если РН77.Проведен()=1 Тогда                     стз = тзДанные77.Добавить();                     стз.Документ        = РН77.НомерДок;                     стз.Период            = РН77.ДатаДок;                     стз.Организация    = РН77.Фирма.Наименование;                     стз.ОрганизацияКлюч = РН77.Фирма.Код;                     стз.Склад            = РН77.МестоХранения.Наименование;                     стз.СкладКлюч        = РН77.МестоХранения.Код;                     стз.Контрагент        = РН77.Контрагент.Наименование;                     стз.КонтрагентКлюч    = РН77.Контрагент.Код;                     стз.Сумма            = РН77.Итог("СуммаСНДС");                 КонецЕсли;                                 //Сообщить("Документ <"+РН77.НомерДок                  //    +"> от <"+РН77.ДатаДок                  //    +">Фирма <"+РН77.Фирма.Наименование                  //    +"> Контрагент <"+РН77.Контрагент.Наименование                  //    +"> Сумма <"+РН77.Итог("СуммаСНДС")                  //   +"> Проведен <"+РН77.Проведен()                  //   +">");                                              КонецЦикла;                                З = Новый Запрос;                           мвт = Новый МенеджерВременныхТаблиц;               З.МенеджерВременныхТаблиц = мвт;                                     З.УстановитьПараметр("тзДанные77",тзДанные77);                                      З.Текст = "                                 |ВЫБРАТЬ                 |    тзДанные77.Организация,                 |    тзДанные77.ОрганизацияКлюч,                 |    тзДанные77.Склад,                 |    тзДанные77.СкладКлюч,                 |    тзДанные77.Контрагент,                 |    тзДанные77.КонтрагентКлюч,                 |    тзДанные77.Документ,                 |    тзДанные77.Период,                 |    тзДанные77.Сумма                 |ПОМЕСТИТЬ Данные77                 |ИЗ                 |    &тзДанные77 КАК тзДанные77                 |;                 |                 ////////////////////////////////////////////////////////////////////////////////                  |ВЫБРАТЬ                 |    Данные77.Организация,                 |    Данные77.ОрганизацияКлюч КАК Ключ,                 |    МАКСИМУМ(Организации.Ссылка) КАК Ссылка                 |ИЗ                 |    Данные77 КАК Данные77                 |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации                 |        ПО Данные77.ОрганизацияКлюч = Организации.Ключ                 |                 |СГРУППИРОВАТЬ ПО                 |    Данные77.Организация,                 |    Данные77.ОрганизацияКлюч                 |                 |ИМЕЮЩИЕ                 |    МАКСИМУМ(Организации.Ссылка) ЕСТЬ NULL ";             рз = З.Выполнить();             Если НЕ рз.Пустой() Тогда                 //ЗначениеВР З.Выполнить().Выгрузить(),ДанныеФормыВЗначение(                  тзОрганизации = З.Выполнить().Выгрузить();                 стрРезультат.Значения.Вставить("Организации",тзОрганизации);             КонецЕсли;                              //Склады              З.Текст = "                 |ВЫБРАТЬ                   |    Данные77.Склад,                   |    Данные77.СкладКлюч КАК Ключ,                   |    МАКСИМУМ(Склады.Ссылка) КАК Ссылка                   |ИЗ                   |    Данные77 КАК Данные77                   |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады                   |        ПО Данные77.СкладКлюч = Склады.Ключ                   |                   |СГРУППИРОВАТЬ ПО                   |    Данные77.Склад,                   |    Данные77.СкладКлюч                 |                   |ИМЕЮЩИЕ                   |    МАКСИМУМ(Склады.Ссылка) ЕСТЬ NULL ";             рз = З.Выполнить().Выгрузить();             Если НЕ рз.Пустой() Тогда                 тзСклады = рз.Выгрузить();                 стрРезультат.Значения.Вставить("Склады",тзСклады);             КонецЕсли;                          //Контрагенты              З.Текст = "                 |ВЫБРАТЬ                   |    Данные77.Контрагент,                   |    Данные77.КонтрагентКлюч КАК Ключ,                   |    МАКСИМУМ(Контрагенты.Ссылка) КАК Ссылка                   |ИЗ                   |    Данные77 КАК Данные77                   |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты                   |        ПО Данные77.КонтрагентКлюч = Контрагент.Ключ                   |                   |СГРУППИРОВАТЬ ПО                   |    Данные77.Контрагент,                   |    Данные77.КонтрагентКлюч                 |                   |ИМЕЮЩИЕ                   |    МАКСИМУМ(Контрагенты.Ссылка) ЕСТЬ NULL ";             Если НЕ рз.Пустой() Тогда                 тзКонтрагенты = рз.Выгрузить();                 стрРезультат.Значения.Вставить("Контрагенты",тзКонтрагенты);             КонецЕсли;                                                        //Продажи              З.Текст = "                 |ВЫБРАТЬ                 |    Данные77.ОрганизацияКлюч,                 |    Данные77.СкладКлюч,                 |    Данные77.КонтрагентКлюч,                                 |    Данные77.Документ,                 |    Данные77.Период,                 |    Данные77.Сумма                                 |ИЗ Данные77";             Если НЕ рз.Пустой() Тогда                 тзПродажи = рз.Выгрузить();                 стрРезультат.Значения.Вставить("Продажи",тзПродажи);             КонецЕсли;                              мвт.Закрыть();             стрРезультат.Результат = Истина;         Иначе                                                     Сообщить("У подключенной базы в выбранном периоде нет документов!");         КонецЕсли;                  v77 = Неопределено;              Исключение         Сообщить(ОписаниеОшибки());                 Если мвт<>Неопределено Тогда             мвт.Закрыть();         КонецЕсли;         v77 = Неопределено;     КонецПопытки;

  

НЕА123

12 — 02.12.15 — 14:48

рз = З.Выполнить();             Если НЕ рз.Пустой() Тогда                 //ЗначениеВР З.Выполнить().Выгрузить(),ДанныеФормыВЗначение(                  тзОрганизации = З.Выполнить().Выгрузить();

  

cfk

13 — 02.12.15 — 14:50

(12) Дайте пепла, я одел рубище

Закрыто

  

cw014

14 — 02.12.15 — 15:01

З.МенеджерВременныхТаблиц = мвт; Удаляй это нафиг

  

cw014

15 — 02.12.15 — 15:01

А, стоп

  

cw014

16 — 02.12.15 — 15:01

Ошибся

(14),(15),(16) Слово ЗАКРЫТО означает что проблема решена. Тема Закрыта.

Особенности и недостатки временных таблиц

Участников наших курсов часто интересует внутренняя логика работы временных таблиц.

Какие критерии индексирования временных таблиц? Где они хранятся? Нужно ли в явном виде их удалять?

Ответы на эти вопросы мы рассмотрим в данной статье.

Также мы приведем случаи, когда не нужно использовать временные таблицы.

Где хранятся временные таблицы?

Временные таблицы — это объекты СУБД, никаких временных таблиц на сервере 1С нет, и не путайте их с таблицами значений.

Под вопросом: «Где хранятся временные таблицы?» – имеется ввиду физическое расположение, т.е. либо жесткий диск, либо оперативная память.

Вероятно, этот вопрос чаще других остается без ответа, либо ответы на него кардинально различаются.

Но все сходятся в том, что временные таблицы создаются и хранятся в базе TempDB.

Действительно, все временные таблицы относятся к базе данных TempDB, но это вовсе не значит, что они обязательно будут записываться на диск.

Правильный ответ на этот вопрос звучит так: все временные таблицы по умолчанию создаются в оперативной памяти, а именно – в буферном кэше.

Конечно, есть исключения. Например, если таблица слишком большая, то сервер может принять решение сбросить ее на диск. Также возможна ситуация, когда сервер по каким-либо причинам решил отдать память под другие данные, тогда таблица тоже будет записана на диск.

Почему таблица создается именно в памяти? Тут все очевидно – дело в производительности, думаю, не стоит объяснять, что чтение из оперативной памяти гораздо быстрее чтения с диска, даже если этот диск SSD.

Проведем эксперимент и проверим, где создается временная таблица.

Пишем следующий запрос в консоли:

ВЫБРАТЬ      1 КАК Поле1 ПОМЕСТИТЬ ВТ

Запускаем трассировку SQL Profiler с событием SQL:BatchComplited, выполняем запрос в консоли и получаем следующий текст SQL запроса:

INSERT INTO #tt1 (_Q_001_F_000) SELECT 1.0

Здесь мы видим только заполнение временной таблицы, т.к. код создания временных таблиц в нашей трассировке не отображается.

Чтобы понять, где создается временная таблица, необходимо понять, откуда читаются данные – с диска или из памяти. Для этого используем показатель physical reads (количество физических чтений), т.е. сколько 8Кб страниц данных было прочитано с диска для выполнения запроса.

Чтобы получить значение этого показателя, необходимо выполнить создание и чтение временной таблицы в Management Studio.

Создаем новый запрос и пишем следующее:

create table #tt1 (_Q_001_F_000 int); -- создаем локальную временную таблицу tt1
INSERT INTO #tt1 (_Q_001_F_000) SELECT 1.0 – заполняем таблицу
set statistics io on; -- включаем вывод статистики ввода/вывода
select * from #tt1 -- читаем данные из таблицы
set statistics io off; -- выключаем вывод статистики
drop table #tt1 -- удаляем таблицу

После выполнения данного кода на закладке «Сообщения» получим следующий текст:

(строк обработано: 1)
Таблица «#tt1_____________________________________________000000000066″.
Число просмотров 1, логических чтений 1, физических чтений 0, 
упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0,
lob упреждающих чтений 0.

Самое важное здесь то, что данные с диска не читались, т.к. число физических чтений равно 0, при этом есть 1 логическое чтение, т.е. данные были прочитаны только из памяти.

Отсюда можно сделать вывод, что временные таблицы в большинстве случаев создаются и хранятся в оперативной памяти, исключения уже описаны выше.

Надо ли индексировать временные таблицы?

На дисках ИТС, на экзамене 1С: Эксперт, да и я на своих курсах говорю, что нужно индексировать поля условий и соединений во временных таблицах.

Эта рекомендация настолько очевидна, что уже практически никто не подвергает ее сомнению.

Но как показывает практика, чаще всего индексы во временных таблицах не используются, либо используются, но запрос выполняется еще медленнее, чем без них. Скажу даже больше: для себя я сделал вывод, что польза от индексов на временных таблицах – скорее исключение, чем правило.

Это не значит, что индексы не нужно использовать, это значит, что необходимо анализировать каждый конкретный случай, и случаев, когда индекс не нужен, значительно больше.

Именно поэтому на курсах по оптимизации постоянно делается акцент на то, что с каждой проблемой надо разбираться отдельно, а не слепо выполнять рекомендации, не понимая, почему эти рекомендации именно такие.

Давайте рассмотрим ситуацию с индексацией на примере.

Создадим временную таблицу с одним числовым полем и значениями от 1 до 1 млн.

Это можно сделать с помощью следующего пакетного запроса:

ВЫБРАТЬ      0 КАК Цифра
ПОМЕСТИТЬ ВТ_Цифры
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ   1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ             2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ             3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ      4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ             5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ             6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ             7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ     8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ             9
; //////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ      100000 * Таб6.Цифра + 10000 * Таб5.Цифра + 1000 * Таб4.Цифра + 100 * Таб3.Цифра + 10 * Таб2.Цифра + Таб1.Цифра + 1 КАК Число
ПОМЕСТИТЬ ВТ_Числа ИЗ           ВТ_Цифры КАК Таб1,        ВТ_Цифры КАК Таб2,        ВТ_Цифры КАК Таб3,        ВТ_Цифры КАК Таб4,             ВТ_Цифры КАК Таб5,        ВТ_Цифры КАК Таб6
; /////////////////////////////////////////////////////////////
ВЫБРАТЬ      ВТ_Числа.Число ИЗ            ВТ_Числа КАК ВТ_Числа ГДЕ       ВТ_Числа.Число = 777

Весь запрос выполняется в среднем за 1.2 секунды.

Если посмотреть трассировку SQL Profiler, то мы увидим следующее:

Временные таблицы 1С в запросе

На создание таблицы уходит 1.1 секунда и еще 0.1 секунда на сканирование всей таблицы, чтобы вернуть нам 1 строку.

Давайте посмотрим, что изменится, если добавить индекс в таблицу ВТ_Числа.

На моем компьютере запрос стал выполняться в среднем за 6 секунд.

Временные таблицы sql

Время создания таблицы увеличилось с 1 секунды до 5.3, при этом даже поиск по индексу в таблице все равно происходит медленнее, чем сканирование: 0.5 сек. против 0.1 без индекса. Единственное, в чем этот запрос выигрывает, — немного меньше логических чтений: 2057 против 2233 при сканировании.

Используйте индексирование только в том случае, если вы видите от этого явный положительный эффект.

Надо ли явно удалять временные таблицы после создания?

Ответ будет зависеть от способа создания временной таблицы.

Если Вы используете временную таблицу только в одном пакетном запросе, то ваша таблица «живет», пока выполняется этот пакетный запрос. Это значит, что менеджер временных таблиц был создан неявно.

В данном случае MS SQL создает локальную временную таблицу с одной решеткой (#), например #tt1.

Как только пакетный запрос завершается, неявный МВТ закрывается, и автоматически последует команда «Truncate table», которая удаляет созданную таблицу.

Если временная таблица проиндексирована, то сначала будет удален индекс и только потом таблица.

Пример можно посмотреть выше в трассировке.

В данном случае нет необходимости использовать команду «УНИЧТОЖИТЬ», только если Вы не хотите создать в том же запросе новую таблицу с таким же именем, ну или считаете это хорошим стилем написания кода.

Здесь главное понимать, что таблица все равно будет удалена при завершении пакетного запроса.

Ситуация меняется, если Вы явно используете менеджер временных таблиц (МВТ), т.е. создаете соответствующий объект метаданных. В этом случае MS SQL создает глобальную временную таблицу с двумя решетками (##).

Такая таблица будет удалена в любом из следующих вариантов:

  1. в запросе использована команда УНИЧТОЖИТЬ
  2. вызван метод МенеджерВременныхТаблиц.Закрыть()
  3. объект МенеджерВременныхТаблиц перестал существовать, например, завершилась работа процедуры/функции, которая породила этот объект, или пользователь закрыл программу

Если Вы используете объект МВТ, то временные таблицы рекомендуется удалять одним из первых 2 методов, как только в них отпала необходимость, иначе они будут висеть в памяти сервера СУБД, пока процедура/функция не закончит работу, что не есть хорошо. Если же у Вас процедура, в которой был создан МВТ завершается как раз выполнением запроса, тогда, конечно, МВТ можно не удалять, т.к. сработает 3 условие.

Подведем итог: если Вы не используете МВТ, то явно удалять временную таблицу не требуется, она будет удалена после завершения пакетного запроса.

Если явное объявление МВТ используется, то рекомендуется удалить таблицу вручную, например, в запросе командой «Уничтожить», либо методом МВТ.Закрыть().

Минусы временных таблиц

Идеальных инструментов не бывает, тем более в мире 1С.

Давайте рассмотрим, какие проблемы может принести активное использование временных таблиц.

Чрезмерное разрастание базы TempDB

Если Вы активно используете временные таблицы, то у Вас может довольно сильно разрастаться база TempDB и в один прекрасный день может занять все свободное место на диске. Размер TempDB автоматически только увеличивается, но не уменьшается. Внутри файла место может как заниматься, так и освобождаться, но сам размер файла только увеличивается.

Типичная ситуация, установили обновление, и через несколько дней TempDB раздуло до неимоверных размеров, а потом выясняется, что разработчики переписали запросы с использованием временных таблиц, причем таблицы эти внушительного размера и их много.

Для исправления ситуации необходимо выполнить следующие команды:

dbcc shrinkfile (tempdev, ЖелаемыйРазмерФайлаДанныхМб)
dbcc shrinkfile (templog, ЖелаемыйРазмерФайлаЛоговМб)

Чрезмерное упрощение запросов

Нельзя сказать, что это очень большой минус, но все же.

Часто временные таблицы используются как раз для упрощения сложных запросов, чтобы серверу было легче подобрать оптимальный план, и это правильно.

Но можно встретить и другую крайность: запрос, который вполне можно было бы написать без временных таблиц, и он бы работал быстро и оптимально, все равно пишут через временные таблицы. Просто разработчику лень думать, как это можно сделать по-другому.

Если можно написать оптимальный запрос без использования временных таблиц, то лучше обойтись без них.

Запрос с оптимальным кодом без временных таблиц в любом случае будет работать быстрее и использовать меньше ресурсов, чем запрос с временными таблицами.

Заключение

После прочтения статьи у Вас может сложиться мнение, что я не советую использовать временные таблицы, но это не так. Напротив, я активно их использую для оптимизации запросов, но делаю это только после того, как удостоверюсь в их эффективности в данном конкретном случае.

Временные таблицы — это инструмент для решения определенных задач, а не волшебная таблетка на все случаи жизни.

Бурмистров Андрей

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.

Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кеш браузера или подписаться через другой браузер.

Временные таблицы — хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово «ПОМЕСТИТЬ В«, например:

Код 1C v 8.х

 |ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары 

Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, нельзя получить список временных таблиц, которые хранятся в запросе.

Пример 1: Как можно выгрузить временную таблицу в таблицу значений и как использовать менеджер временных таблиц:

Код 1C v 8.х

 Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары");
Запрос.Выполнить(); //Создалась таблица ВТТовары
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТовары");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; //Копируем ссылку на временные таблицы
ТЗ=ЗапросТМП.Выполнить().Выгрузить(); //Получаем временную таблицу в таблице значений
Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие - колонки таблицы значений должны быть типизированными, т.е. иметь тип. Вот пример, демонстрирующий это:

ТЗ=Новый ТаблицаЗначений();
//Колонки должны быть типизированы
ТЗ.Колонки.Добавить("А", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка"));

//Заполняем таблицу данными
Стр=ТЗ.Добавить();
Стр.А="А";
Стр.Б="Б";
Стр=ТЗ.Добавить();
Стр.А="А1";
Стр.Б="Б1";

//Загружаем таблицу значений в менеджер временных таблиц запроса
Запрос=Новый Запрос("Выбрать Т.А, Т.Б ПОМЕСТИТЬ ВТТаб Из &Таб Как Т");
//Вариант: Запрос=Новый Запрос("Выбрать * ПОМЕСТИТЬ ВТТаб Из &Таб Как Т");
Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Таб",ТЗ);
Запрос.Выполнить();

//Получаем таблицу из менеджера временных таблиц запроса
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТаб");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц;
ТЗ1=ЗапросТМП.Выполнить().Выгрузить();
ТЗ1.ВыбратьСтроку(); //Показываем полученную таблицу

Вместо перечисления списка полей можно использовать «ВЫБРАТЬ * «.
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:

Код 1C v 8.х

 Процедура ТипизацияТЗ(ТЗ) Экспорт
РезультатТЗ = новый ТаблицаЗначений;
Для Каждого Колонка из ТЗ.Колонки Цикл
Имя = Колонка.Имя;
МассивТипов = новый Массив(1);
МассивТипов[0] = ТипЗнч(ТЗ[0][Имя]);
Описатель = новый ОписаниеТипов(МассивТипов);
РезультатТЗ.Колонки.Добавить(Имя, Описатель);
КонецЦикла;

Для каждого Строка из ТЗ Цикл
СтрокаРез = РезультатТЗ.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаРез, Строка);
КонецЦикла;

ТЗ = РезультатТЗ.Скопировать();
КонецПроцедуры

Пример 2: Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) — Запрос будет такой:

Код 1C v 8.х

 ВЫБРАТЬ
ВзаиморасчетыСРаботникамиОрганизаций.Период,
ВзаиморасчетыСРаботникамиОрганизаций.Физлицо,
ВзаиморасчетыСРаботникамиОрганизаций.СуммаВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций.Организация,
ВзаиморасчетыСРаботникамиОрганизаций.ПериодВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций.Регистратор
ПОМЕСТИТЬ РегВзаимРасч
ИЗ
РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
ГДЕ
ВзаиморасчетыСРаботникамиОрганизаций.Период МЕЖДУ &ДатаН И &ДатаК
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо,
ЗарплатаКВыплатеОрганизацийЗарплата.Сумма,
ЗарплатаКВыплатеОрганизацийЗарплата.ВыплаченностьЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата.КомпенсацияЗаЗадержкуЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка
ПОМЕСТИТЬ ДокумЗарплКВыпл
ИЗ
Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
ГДЕ
ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РегВзаимРасч.Период,
РегВзаимРасч.Физлицо,
РегВзаимРасч.СуммаВзаиморасчетов,
ДокумЗарплКВыпл.Сумма,
ДокумЗарплКВыпл.ВыплаченностьЗарплаты,
ДокумЗарплКВыпл.КомпенсацияЗаЗадержкуЗарплаты
ИЗ
РегВзаимРасч КАК РегВзаимРасч
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокумЗарплКВыпл КАК ДокумЗарплКВыпл
ПО РегВзаимРасч.Регистратор = ДокумЗарплКВыпл.Ссылка
И РегВзаимРасч.Физлицо = ДокумЗарплКВыпл.Физлицо
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ РегВзаимРасч
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ДокумЗарплКВыпл

   cfk

02.12.15 — 14:36

тзДанные77  = Новый ТаблицаЗначений;                

            мт             = Новый Массив;

            мт.Добавить(Тип(«Строка»));          

            мт.Добавить(Тип(«Дата»));          

            мт.Добавить(Тип(«Число»));          

            отСтрока     = Новый ОписаниеТипов(мт,,,

                Новый КвалификаторыЧисла(9,2,ДопустимыйЗнак.Любой),

                Новый КвалификаторыСтроки(25,ДопустимаяДлина.Переменная),

                Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя),);

            
            стрКолонки     = Новый Структура(«Документ,Период,Организация,ОрганизацияКлюч,»

                +»Склад,СкладКлюч,Контрагент,КонтрагентКлюч,Сумма»);                

            Для каждого киз Из стрКолонки Цикл

                тзДанные77.Колонки.Добавить(киз.Ключ,отСтрока);

            КонецЦикла;

            
            Пока РН77.ПолучитьДокумент()=1 Цикл

                Если РН77.Проведен()=1 Тогда

                    стз = тзДанные77.Добавить();

                    стз.Документ         = РН77.НомерДок;

                    стз.Период             = РН77.ДатаДок;

                    стз.Организация     = РН77.Фирма.Наименование;

                    стз.ОрганизацияКлюч = РН77.Фирма.Код;

                    стз.Склад             = РН77.МестоХранения.Наименование;

                    стз.СкладКлюч         = РН77.МестоХранения.Код;

                    стз.Контрагент        = РН77.Контрагент.Наименование;

                    стз.КонтрагентКлюч    = РН77.Контрагент.Код;

                    стз.Сумма             = РН77.Итог(«СуммаСНДС»);

                КонецЕсли;                

                 //Сообщить(«Документ <«+РН77.НомерДок

                 //    +»> от <«+РН77.ДатаДок

                 //    +»>Фирма <«+РН77.Фирма.Наименование

                 //    +»> Контрагент <«+РН77.Контрагент.Наименование

                 //    +»> Сумма <«+РН77.Итог(«СуммаСНДС»)

                 //   +»> Проведен <«+РН77.Проведен()

                 //   +»>»);                                  

            КонецЦикла;

                
               З = Новый Запрос;            

               мвт = Новый МенеджерВременныхТаблиц;

               З.МенеджерВременныхТаблиц = мвт;                        

            З.УстановитьПараметр(«тзДанные77»,тзДанные77);

                        
            З.Текст = »                

                |ВЫБРАТЬ

                |    тзДанные77.Организация,

                |    тзДанные77.ОрганизацияКлюч,

                |    тзДанные77.Склад,

                |    тзДанные77.СкладКлюч,

                |    тзДанные77.Контрагент,

                |    тзДанные77.КонтрагентКлюч,

                |    тзДанные77.Документ,

                |    тзДанные77.Период,

                |    тзДанные77.Сумма

                |ПОМЕСТИТЬ Данные77

                |ИЗ

                |    &тзДанные77 КАК тзДанные77

                |;

                |

                |////////////////////////////////////////////////////////////////////////////////

                |ВЫБРАТЬ

                |    Данные77.Организация,

                |    Данные77.ОрганизацияКлюч КАК Ключ,

                |    МАКСИМУМ(Организации.Ссылка) КАК Ссылка

                |ИЗ

                |    Данные77 КАК Данные77

                |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации

                |        ПО Данные77.ОрганизацияКлюч = Организации.Ключ

                |

                |СГРУППИРОВАТЬ ПО

                |    Данные77.Организация,

                |    Данные77.ОрганизацияКлюч

                |

                |ИМЕЮЩИЕ

                |    МАКСИМУМ(Организации.Ссылка) ЕСТЬ NULL «;

            рз = З.Выполнить();

   cfk

11 — 02.12.15 — 14:45

(8), (9) так понятнее?

Попытка                

        v77 = Новый COMОбъект(«V77.Application»);

        
        Dir = стрПар.Каталог;

        Usr = стрПар.Пользователь;

        Pwd = стрПар.Пароль;

        
        ConnStr = «/D»»»+Dir+»»»»

            +» /N»»»+Usr+»»»»+            

            ?(StrLen(TrimAll(Pwd))<>0,» /P»»»+Pwd+»»» «,»»);

        
//        Сообщить(«Подключаюcь как <«+Usr+»> к <«+Dir+»>»);

        
        Если v77.Initialize(v77.RMTrade,TrimAll(ConnStr),»NO_SPLASH_SHOW») = 0 Тогда

            ВызватьИсключение(«Сбой подключения к <«+Dir+»>»);

        КонецЕсли;

        
//        Сообщить(«Успешно подключена база <«+Dir+»>»);

        
        Период = стрПар.Период;

        
        РН77 = v77.CreateObject(«Документ.РасходнаяНакладная»);

        Если РН77.ВыбратьДокументы(Период.ДатаНачала,Период.ДатаОкончания) = 1 Тогда

            
            тзДанные77  = Новый ТаблицаЗначений;                

            мт             = Новый Массив;

            мт.Добавить(Тип(«Строка»));          

            мт.Добавить(Тип(«Дата»));          

            мт.Добавить(Тип(«Число»));          

            отТипы     = Новый ОписаниеТипов(мт,,,

                Новый КвалификаторыЧисла(9,2,ДопустимыйЗнак.Любой),

                Новый КвалификаторыСтроки(25,ДопустимаяДлина.Переменная),

                Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя),);

            
            стрКолонки     = Новый Структура(«Документ,Период,Организация,ОрганизацияКлюч,»

                +»Склад,СкладКлюч,Контрагент,КонтрагентКлюч,Сумма»);                

            Для каждого киз Из стрКолонки Цикл

                тзДанные77.Колонки.Добавить(киз.Ключ,отТипы);

            КонецЦикла;

            
            Пока РН77.ПолучитьДокумент()=1 Цикл

                Если РН77.Проведен()=1 Тогда

                    стз = тзДанные77.Добавить();

                    стз.Документ         = РН77.НомерДок;

                    стз.Период             = РН77.ДатаДок;

                    стз.Организация     = РН77.Фирма.Наименование;

                    стз.ОрганизацияКлюч = РН77.Фирма.Код;

                    стз.Склад             = РН77.МестоХранения.Наименование;

                    стз.СкладКлюч         = РН77.МестоХранения.Код;

                    стз.Контрагент        = РН77.Контрагент.Наименование;

                    стз.КонтрагентКлюч    = РН77.Контрагент.Код;

                    стз.Сумма             = РН77.Итог(«СуммаСНДС»);

                КонецЕсли;                

                 //Сообщить(«Документ <«+РН77.НомерДок

                 //    +»> от <«+РН77.ДатаДок

                 //    +»>Фирма <«+РН77.Фирма.Наименование

                 //    +»> Контрагент <«+РН77.Контрагент.Наименование

                 //    +»> Сумма <«+РН77.Итог(«СуммаСНДС»)

                 //   +»> Проведен <«+РН77.Проведен()

                 //   +»>»);                                  

            КонецЦикла;

                
               З = Новый Запрос;            

               мвт = Новый МенеджерВременныхТаблиц;

               З.МенеджерВременныхТаблиц = мвт;                        

            З.УстановитьПараметр(«тзДанные77»,тзДанные77);

                        
            З.Текст = »                

                |ВЫБРАТЬ

                |    тзДанные77.Организация,

                |    тзДанные77.ОрганизацияКлюч,

                |    тзДанные77.Склад,

                |    тзДанные77.СкладКлюч,

                |    тзДанные77.Контрагент,

                |    тзДанные77.КонтрагентКлюч,

                |    тзДанные77.Документ,

                |    тзДанные77.Период,

                |    тзДанные77.Сумма

                |ПОМЕСТИТЬ Данные77

                |ИЗ

                |    &тзДанные77 КАК тзДанные77

                |;

                |

                |////////////////////////////////////////////////////////////////////////////////

                |ВЫБРАТЬ

                |    Данные77.Организация,

                |    Данные77.ОрганизацияКлюч КАК Ключ,

                |    МАКСИМУМ(Организации.Ссылка) КАК Ссылка

                |ИЗ

                |    Данные77 КАК Данные77

                |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации

                |        ПО Данные77.ОрганизацияКлюч = Организации.Ключ

                |

                |СГРУППИРОВАТЬ ПО

                |    Данные77.Организация,

                |    Данные77.ОрганизацияКлюч

                |

                |ИМЕЮЩИЕ

                |    МАКСИМУМ(Организации.Ссылка) ЕСТЬ NULL «;

            рз = З.Выполнить();

            Если НЕ рз.Пустой() Тогда

                //ЗначениеВР З.Выполнить().Выгрузить(),ДанныеФормыВЗначение(

                тзОрганизации = З.Выполнить().Выгрузить();

                стрРезультат.Значения.Вставить(«Организации»,тзОрганизации);

            КонецЕсли;    

            
            //Склады

            З.Текст = »

                |ВЫБРАТЬ

                  |    Данные77.Склад,

                  |    Данные77.СкладКлюч КАК Ключ,

                  |    МАКСИМУМ(Склады.Ссылка) КАК Ссылка

                  |ИЗ

                  |    Данные77 КАК Данные77

                  |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады

                  |        ПО Данные77.СкладКлюч = Склады.Ключ

                  |

                  |СГРУППИРОВАТЬ ПО

                  |    Данные77.Склад,

                  |    Данные77.СкладКлюч

                |

                  |ИМЕЮЩИЕ

                  |    МАКСИМУМ(Склады.Ссылка) ЕСТЬ NULL «;

            рз = З.Выполнить().Выгрузить();

            Если НЕ рз.Пустой() Тогда

                тзСклады = рз.Выгрузить();

                стрРезультат.Значения.Вставить(«Склады»,тзСклады);

            КонецЕсли;

            
            //Контрагенты

            З.Текст = »

                |ВЫБРАТЬ

                  |    Данные77.Контрагент,

                  |    Данные77.КонтрагентКлюч КАК Ключ,

                  |    МАКСИМУМ(Контрагенты.Ссылка) КАК Ссылка

                  |ИЗ

                  |    Данные77 КАК Данные77

                  |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

                  |        ПО Данные77.КонтрагентКлюч = Контрагент.Ключ

                  |

                  |СГРУППИРОВАТЬ ПО

                  |    Данные77.Контрагент,

                  |    Данные77.КонтрагентКлюч

                |

                  |ИМЕЮЩИЕ

                  |    МАКСИМУМ(Контрагенты.Ссылка) ЕСТЬ NULL «;

            Если НЕ рз.Пустой() Тогда

                тзКонтрагенты = рз.Выгрузить();

                стрРезультат.Значения.Вставить(«Контрагенты»,тзКонтрагенты);

            КонецЕсли;

                                          
            //Продажи

            З.Текст = »

                |ВЫБРАТЬ

                |    Данные77.ОрганизацияКлюч,

                |    Данные77.СкладКлюч,

                |    Данные77.КонтрагентКлюч,                

                |    Данные77.Документ,

                |    Данные77.Период,

                |    Данные77.Сумма                

                |ИЗ Данные77″;

            Если НЕ рз.Пустой() Тогда

                тзПродажи = рз.Выгрузить();

                стрРезультат.Значения.Вставить(«Продажи»,тзПродажи);

            КонецЕсли;

                
            мвт.Закрыть();

            стрРезультат.Результат = Истина;

        Иначе                                        

            Сообщить(«У подключенной базы в выбранном периоде нет документов!»);

        КонецЕсли;

        
        v77 = Неопределено;

        
    Исключение

        Сообщить(ОписаниеОшибки());        

        Если мвт<>Неопределено Тогда

            мвт.Закрыть();

        КонецЕсли;

        v77 = Неопределено;

    КонецПопытки;

{Обработка.Импорт.Форма.Форма.Форма}: Ошибка при вызове метода контекста (Выполнить): {(12, 11)}: Временная таблица уже существует «Данные77» ПОМЕСТИТЬ <<?>>Данные77

второй раз вызываешь без обнуления переменных…

Отладкой делаешь З.Выполнить, смотришь результат. А как оно само доходит до этой строчки, то падает.

тоесть нет =) С первого раза выскакивает. А менеджер в исключении закрывается

не понял, чем будет отличаться отладка от рантайма в данном случае

тем, что в рантайм не будет повторного создания ВТ

(8,9) где вы видите повторное создание. С ПЕРВОГО раза выскакивает, говорю вам. и Менеджер временных таблиц закрывается каждый раз при исключении. Т.е. временные таблицы после каждого исключения уничтожаются.

Дайте пепла, я одел рубище Закрыто

З.МенеджерВременныхТаблиц = мвт; Удаляй это нафиг

,, Слово ЗАКРЫТО означает что проблема решена. Тема Закрыта.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account

Labels

ошибка ИР

Несоответствие поведения программы задуманному

проблема

Неожиданное или неудобное поведение программы

  • 1с ошибка блокировки объекта объект уже заблокирован толстый клиент
  • 1с ошибка блокировки объекта объект уже заблокирован компьютер
  • 1с ошибка анализа макета шаблона макет шаблона офисного документа имеет неверный формат
  • 1с ошибка аварийное завершение при синхронизации
  • 1с ошибка windows error ошибка исполнения функции при установке платформы 1с