Меню

1с выборкадетальныезаписи ошибка чтения значения

Простой запрос и ошибка в чтении значения

Я
   Iater

09.06.15 — 01:07

Всем привет! Помогите, пожалуйста, справится с запросом — в консоли запросов всё работает идеально, а на практике выдает ошибку в чтении значения я хз почему:

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

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Сотрудники.ДатаРождения КАК ДатаРождения

        |ИЗ

        |    Справочник.Сотрудники КАК Сотрудники

        |ГДЕ

        |    Сотрудники.Наименование = &ФИО»;

        
    Запрос.УстановитьПараметр(«ФИО», ФИО);

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

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

         
    ВыборкаДетальныеЗаписи.Следующий();

    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;

Как я понял, проблема в позиционировании выборки на значении? Как же спозиционировать-то иначе?

   Iater

1 — 09.06.15 — 01:10

забыл скачать — в 8.3 работаю

   Сергиус

2 — 09.06.15 — 01:11

(0)Что у тебя в параметре ФИО?

   Iater

3 — 09.06.15 — 01:13

в ФИО  - Иванов

я точку останова поставил - в ФИО точно нормально всё читает
   France

4 — 09.06.15 — 01:14

пока ВыборкаДетальныеЗаписи.Следующий()  цикл
 здесь песню поешь
конецЦикла.

и не будет ошибки..

   Сергиус

5 — 09.06.15 — 01:15

(3)Запрос.УстановитьПараметр(«ФИО», СокрЛП(ФИО));

   Iater

6 — 09.06.15 — 01:16

у меня одно значение, не нужен цикл. Впрочем, поставил — ноль на массу. Не работает всё равно

   Iater

7 — 09.06.15 — 01:17

в ФИО сейчас забил не Иванов, а цифру «1» — не работает хоть как ты СокрЛП или не сокр

   Сергиус

8 — 09.06.15 — 01:19

(7)Так может нет такого сотрудника с наименованием «1» в базе?

   Iater

9 — 09.06.15 — 01:19

Сергиус, есть… в консоли же всё верно выводит

   Сергиус

10 — 09.06.15 — 01:22

ВыборкаДетальныеЗаписи.Количество() что говорит?

   Iater

11 — 09.06.15 — 01:24

неопределено

   Сергиус

12 — 09.06.15 — 01:29

Сохрани все в обработку, и выложи куда ть.

   Сергиус

13 — 09.06.15 — 01:29

или можно по ТимВьюверу)

   France

14 — 09.06.15 — 01:34

(6) сообщение об ошибке есть?.. если да, то текст сюда.

   Iater

15 — 09.06.15 — 01:36

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

   France

16 — 09.06.15 — 01:39

а ФИО как устанавливается?? можно сюда текст??

   France

17 — 09.06.15 — 01:42

в консоли небось параметры автоматически определяешь.. и выбор значения делаешь по кнопке выбора..

   Iater

18 — 09.06.15 — 01:43

в форме документа делаю:

&НаСервере

Функция ДатаРождения (ФИО)
    

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

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

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
         
    ВыборкаДетальныеЗаписи.Следующий();
    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
    
    Возврат ДатаРождения;    
    
    
КонецФункции

&НаКлиенте
Процедура ФИОФИОПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.ФИО.ТекущиеДанные;
    ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);
    
    ДатаДокумента = Объект.Дата;
    
    Возраст = ДатаДокумента - ДатаРождения;
    
    СтрокаТабличнойЧасти.Возраст = Возраст;

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

19 — 09.06.15 — 01:46

смотри что тут » ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);»

   Iater

20 — 09.06.15 — 01:50

не понял что там?

   Вася Чез

21 — 09.06.15 — 01:50

(18) ДатаДокумента и ДатаРождения это дата в секундах или что?

   Iater

22 — 09.06.15 — 01:52

да плевать пока, в секундах наверняка )) у меня запрос не получается — вот что хреново

   France

23 — 09.06.15 — 01:53

(20) тип значения.

   Iater

24 — 09.06.15 — 01:55

France, объясни, пожалуйста, как для тупого )) ФИО передается в запрос — я это вижу, когда ставлю точку останова

   France

25 — 09.06.15 — 01:59

(24) да, ты видишь фио, но не обязательно что это строка. а в запросе ты со строкой сравниваешь. в отладчике тип значения виден..

   Iater

26 — 09.06.15 — 02:09

France, ФИО из формы передается как ссылка (тип СправочникСсылка.Сотрудники)

чета я не соображаю в чем проблема
   Вася Чез

27 — 09.06.15 — 02:11

(26) Проблема в том, что в консоли у тебя ФИО строка, а сейчас у ФИО какой тип? посмотри в отладчике, правой тапкой по ФИО во время отладки «Вычислить выражение».

   France

28 — 09.06.15 — 02:14

СправочникСсылка.Сотрудники (27) (26) ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО.наименование);»

   France

29 — 09.06.15 — 02:14

в консоли он как раз устанавливал правильное значение, а не строку, так как в консоли 1С-на сама тип определяет..

   Iater

30 — 09.06.15 — 02:16

всё заработала, спасибо огромное!!

Дейсвительно из-за типа ФИО. Поставил:

   Iater

31 — 09.06.15 — 02:17

ДатаРождения = ДатаРождения(Строка(СтрокаТабличнойЧасти.ФИО));

и всё заработало
   France

32 — 09.06.15 — 02:24

(31) в другом месте такое преобразование боком вылезти может))

   Iater

33 — 09.06.15 — 02:37

почему7

   Iater

34 — 09.06.15 — 02:37

как по-другому сделать, чтобы всё было правильно и работало?

   France

35 — 09.06.15 — 02:39

(33) у спр сотрудники представление «наименование». если бы был код — твой вариант не сработал бы (хотя, представление код вроде и не часто используется). нужно было явно указать ФИО.Наименование, либо в запросе делать фильтр на ссылку, а не на наименование..

   Simod

36 — 09.06.15 — 06:51

Раньше было «модно» искать через НайтиПоНаименованию(), сейчас это делают через Запросы. Может пора разобраться что такое Ссылка и Объект, и как с ними работать?

   hhhh

37 — 09.06.15 — 07:11

(34) ну, по-нормальному. Выбирать сотрудника из справочника, а не писать вручную фамилию.

   Вася Чез

38 — 09.06.15 — 07:31

(37) может это особенность нетленки ТС — заполнять ТЧ вручную, хз правда зачем

   azt-yur

39 — 09.06.15 — 07:47

У тебя уже ссылка на справочник имеется. Зачем писать целую функцию для получения даты рождения, да еще и с запросом к этому же справочнику?

Не проще ли

ДатаРождения = СтрокаТабличнойЧасти.ФИО.ДатаРождения;
   katc

40 — 09.06.15 — 08:47

Выборка и пустой может быть.

Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда
    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
КонецЕсли;
   ДенисЧ

41 — 09.06.15 — 08:50

"Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда "

три года. Без конфискации.
   katc

42 — 09.06.15 — 09:18

что Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Что если  ВыборкаДетальныеЗаписи.Следующий() Цикл

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

   katc

43 — 09.06.15 — 09:21

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

Ну а теперь расскажи за что в этом случае меня надо на 3 года?

Чем конструкция Пока Выборка.Следующий() Цикл
отличается от Если Выборка.Следующий() Тогда
  

Krolik Bezobraznik

44 — 09.06.15 — 09:29

Чудес не бывает.

Перемудрил с типами значений передаваемых параметров.

Ваш запрос ничего не возвращает. Далее у вас стоит процедура получения значения строки. Строк у вас нет, а вы упорно даете указание чтобы вернуть значение. Тут и проблема. ИМХО.

Используйте конструкцию с циклом. Она более корректная. Если переживаете, что ваш запрос вернет более одной строки, то возвращайте в запросе ПЕРВЫЕ 1. Если результат запроса будет пустым, то ошибок не будет и вы отладчиком увидите, если проблемы будут.

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   дфГосЗаказОбороты.Держатель КАК Держатель,
            |   дфГосЗаказОбороты.ПостащикЛома КАК ПостащикЛома,
            |   дфГосЗаказОбороты.ВидКонтракта КАК ВидКонтракта,
            |   дфГосЗаказОбороты.Статус КАК Статус,
            |   ВложенныйЗапрос.Контрагент КАК Контрагент,
            |   дфГосЗаказОбороты.ЯнварьОборот КАК Январь,
            |   дфГосЗаказОбороты.ФевральОборот КАК Февраль,
            |   дфГосЗаказОбороты.МартОборот КАК Март,
            |   дфГосЗаказОбороты.АпрельОборот КАК Апрель,
            |   дфГосЗаказОбороты.МайОборот КАК Май,
            |   дфГосЗаказОбороты.ИюньОборот КАК Июнь,
            |   дфГосЗаказОбороты.ИюльОборот КАК Июль,
            |   дфГосЗаказОбороты.АвгустОборот КАК Август,
            |   дфГосЗаказОбороты.СентябрьОборот КАК Сентябрь,
            |   дфГосЗаказОбороты.ОктябрьОборот КАК Октябрь,
            |   дфГосЗаказОбороты.НоябрьОборот КАК Ноябрь,
            |   дфГосЗаказОбороты.ДекабрьОборот КАК Декабрь
            |ИЗ
            |   (ВЫБРАТЬ
            |       ххх_МеталлоломОбороты.Контрагент КАК Контрагент,
            |       ххх_МеталлоломОбороты.ЧистыйВесОборот КАК ЧистыйВесОборот,
            |       ххх_МеталлоломОбороты.Держатель КАК Держатель
            |   ИЗ
            |       РегистрНакопления.ххх_Металлолом.Обороты КАК ххх_МеталлоломОбороты) КАК ВложенныйЗапрос
            |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.дфГосЗаказ.Обороты КАК дфГосЗаказОбороты
            |       ПО дфГосЗаказОбороты.ПостащикЛома.Наименование = ВложенныйЗапрос.Контрагент.Наименование
            |ГДЕ
            |   дфГосЗаказОбороты.Статус <> &Статус
            |   И дфГосЗаказОбороты.ВидКонтракта = &ВидКонтракта
            |   И дфГосЗаказОбороты.ПостащикЛома <> дфГосЗаказОбороты.Держатель
            |   И ВложенныйЗапрос.Держатель = &Держатель";
                
            Запрос.УстановитьПараметр("Статус", Перечисления.дфСтатусыГосЗаказа.Расторгнут);
            Запрос.УстановитьПараметр("ВидКонтракта", Перечисления.дфВидыКонтрактов.Госзаказ);
            Запрос.УстановитьПараметр("Держатель", Отчет.Организация);
 
            //Запрос.УстановитьПараметр("ДатаНачалаПериода", НачалоГода(Отчет.Дата));
            //Запрос.УстановитьПараметр("ДатаОкончанияПериода", КонецГода(Отчет.Дата));
            //Запрос.УстановитьПараметр("ВыбраннаяОрганизация", Отчет.Организация);
                            
            РезультатЗапроса = Запрос.Выполнить();
            
            Выгрузка = РезультатЗапроса.Выгрузить();
            
            ВыборкаДетальныеЗаписиОсновнаяЧасть = РезультатЗапроса.Выбрать();
 
            Пока ВыборкаДетальныеЗаписиОсновнаяЧасть.Следующий() Цикл           
            //заполняем остальную таблицу, где Держатель != ПоставщикЛома
                ОбластьОсновного.Параметры.Заполнить(ВыборкаДетальныеЗаписиОсновнаяЧасть);
                Если Не ТабличныйДокумент.ПроверитьВывод(ОбластьОсновного) Тогда
                    ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
                    НомерЛиста = НомерЛиста + 1;
                    ОбластьШапки.Параметры.НомерЛиста = НомерЛиста;
                    ТабличныйДокумент.Вывести(ОбластьОсновного);
                КонецЕсли;
                ТабличныйДокумент.Вывести(ОбластьОсновного);
 
            ОбластьОсновного.Параметры.УНП = ВыборкаДетальныеЗаписиОсновнаяЧасть.Контрагент.ИНН;
            ОбластьОсновного.Параметры.НаименованиеОрганизации = ВыборкаДетальныеЗаписиОсновнаяЧасть.ПостащикЛома.Наименование;
                        
                
                МесяцЧисло = Месяц(Отчет.Дата); //Получаем число месяца из переменной КонецМесяца
                
                Запрос = Новый Запрос;
                Запрос.Текст = 
                    "ВЫБРАТЬ
                    |   СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаМесяц
                    |ИЗ
                    |   РегистрНакопления.ххх_Металлолом.Обороты(&НачалоМесяца, &КонецМесяца, Месяц, ) КАК ххх_МеталлоломОбороты
                    |ГДЕ
                    |   ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоМесяца И &КонецМесяца
                    |   И ххх_МеталлоломОбороты.Партнер = &Партнер";
                
                Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Отчет.Дата));
                Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Отчет.Дата));
                Запрос.УстановитьПараметр("Партнер", Отчет.Организация);
 
                РезультатЗапроса = Запрос.Выполнить();
                
                ВыборкаПоМесяцу = РезультатЗапроса.Выбрать();
        
                Пока ВыборкаПоМесяцу.Следующий() Цикл
      
                    Если МесяцЧисло = 1 Тогда     // определяем число Месяца и считаем план за месяц
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 2 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 3 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Март;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 4 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 5 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Май;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 6 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 7 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 8 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Август;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;;
                    ИначеЕсли МесяцЧисло = 9 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 10 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 11 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 12 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    КонецЕсли;
                    ОбластьОсновного.Параметры.ФактМесяц = Формат(ОбластьОсновного.Параметры.ФактМесяц,"ЧДЦ=3"); 
                    
                КонецЦикла;
                
                //проверка на пустоту плана за месяц
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланМесяц) Тогда
                    СуммаПланМесяц = СуммаПланМесяц + ОбластьОсновного.Параметры.ПланМесяц;
                Иначе
                    СуммаПланМесяц = СуммаПланМесяц + 0;
                КонецЕсли;
                
                //проверка на пустоту факта за месяц
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактМесяц) Тогда
                    СуммаФактМесяц = СуммаФактМесяц + ОбластьОсновного.Параметры.ФактМесяц;
                Иначе
                    СуммаФактМесяц = СуммаФактМесяц + 0;
                КонецЕсли;
 
                // подсчёт процента за Месяц и проверка на пустоту Плана и Факта
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланМесяц) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактМесяц)  Тогда
                    ПроцентЗаМесяц = ОбластьОсновного.Параметры.ФактМесяц/ОбластьОсновного.Параметры.ПланМесяц*100;
                    ОбластьОсновного.Параметры.ПроцентМесяц = Формат(ПроцентЗаМесяц,"ЧДЦ=2"); 
                Иначе
                    ОбластьОсновного.Параметры.ПроцентМесяц = " ";
                КонецЕсли;
                
                //считаем план за квартал
                Запрос = Новый Запрос;
                Запрос.Текст = 
                    "ВЫБРАТЬ
                    |   СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаКвартал
                    |ИЗ
                    |   РегистрНакопления.ххх_Металлолом.Обороты(&НачалоКвартала, &КонецКвартала, Квартал, ) КАК ххх_МеталлоломОбороты
                    |ГДЕ
                    |   ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоКвартала И &КонецКвартала
                    |   И ххх_МеталлоломОбороты.Партнер = &Партнер";
                
                Запрос.УстановитьПараметр("НачалоКвартала", НачалоКвартала(Отчет.Дата));
                Запрос.УстановитьПараметр("КонецКвартала", КонецКвартала(Отчет.Дата));
                Запрос.УстановитьПараметр("Партнер", Отчет.Организация);
 
                РезультатЗапроса = Запрос.Выполнить();
                
                ВыборкаПоКварталу = РезультатЗапроса.Выбрать();
                
                Пока ВыборкаПоКварталу.Следующий() Цикл
                    //Определяем число месяца и считаем План за Квартал   
                    Если МесяцЧисло = 1 ИЛИ МесяцЧисло = 2 ИЛИ МесяцЧисло = 3 Тогда        
                        ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь +  ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март;
                        ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал;
                    ИначеЕсли МесяцЧисло = 4 ИЛИ МесяцЧисло = 5 ИЛИ МесяцЧисло = 6 Тогда
                        ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель +  ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь;
                        ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал;
                    ИначеЕсли МесяцЧисло = 7 ИЛИ МесяцЧисло = 8 ИЛИ МесяцЧисло = 9 Тогда
                        ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль +  ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь;
                        ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал;
                    ИначеЕсли МесяцЧисло = 10 ИЛИ МесяцЧисло = 11 ИЛИ МесяцЧисло = 12 Тогда
                        ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь +  ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь;
                        ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал;
                    КонецЕсли;
                    ОбластьОсновного.Параметры.ФактКвартал = Формат(ОбластьОсновного.Параметры.ФактКвартал,"ЧДЦ=3"); 
 
                КонецЦикла;
                
                //проверка на пустоту плана за квартал
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланКвартал) Тогда
                    СуммаПланКвартал = СуммаПланКвартал + ОбластьОсновного.Параметры.ПланКвартал;
                Иначе
                    СуммаПланКвартал = СуммаПланКвартал + 0;
                КонецЕсли;
                
                //проверка на пустоту факта за квартал
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактКвартал) Тогда
                    СуммаФактКвартал = СуммаФактКвартал + ОбластьОсновного.Параметры.ФактКвартал;
                Иначе
                    СуммаФактКвартал = СуммаФактКвартал + 0;
                КонецЕсли;
 
                // подсчёт процента за Квартал и проверка на пустоту Плана и Факта
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланКвартал) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактКвартал)  Тогда
                    ПроцентЗаКвартал = ОбластьОсновного.Параметры.ФактКвартал/ОбластьОсновного.Параметры.ПланКвартал*100;
                    ОбластьОсновного.Параметры.ПроцентКвартал = Формат(ПроцентЗаКвартал,"ЧДЦ=2");
                Иначе
                    ОбластьОсновного.Параметры.ПроцентКвартал = " ";
                КонецЕсли;
                        
                Запрос = Новый Запрос;
                Запрос.Текст = 
                    "ВЫБРАТЬ
                    |   СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаГод
                    |ИЗ
                    |   РегистрНакопления.ххх_Металлолом.Обороты(&НачалоГода, &КонецВыбранногоМесяца, Год, ) КАК ххх_МеталлоломОбороты
                    |ГДЕ
                    |   ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоГода И &КонецВыбранногоМесяца
                    |   И ххх_МеталлоломОбороты.Партнер = &Партнер";
                
                Запрос.УстановитьПараметр("КонецВыбранногоМесяца", КонецМесяца(Отчет.Дата));
                Запрос.УстановитьПараметр("НачалоГода", НачалоГода(Отчет.Дата));
                Запрос.УстановитьПараметр("Партнер", Отчет.Организация);
 
                
                РезультатЗапроса = Запрос.Выполнить();
                
                ВыборкаФактЗаГод = РезультатЗапроса.Выбрать();
                
                Пока ВыборкаФактЗаГод.Следующий() Цикл
                    //Определяем число месяца и считаем План за Год   
                        Если МесяцЧисло=1 Тогда  
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 2 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписи.Февраль;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 3 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 4 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 5 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 6 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 7 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 8 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 9 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 10 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 11 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 12 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь;     
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        КонецЕсли;
                        
                        ОбластьОсновного.Параметры.ФактГод = Формат(ОбластьОсновного.Параметры.ФактГод,"ЧДЦ=3"); 
                КонецЦикла;
                
                
                //проверка на пустоту плана за год
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланГод) Тогда
                    СуммаПланГод = СуммаПланГод + ОбластьОсновного.Параметры.ПланГод;
                Иначе
                    СуммаПланГод = СуммаПланГод + 0;
                КонецЕсли;
                
                //проверка на пустоту факта за год
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактГод) Тогда
                    СуммаФактГод = СуммаФактГод + ОбластьОсновного.Параметры.ФактГод;
                Иначе
                    СуммаФактГод = СуммаФактГод + 0;
                КонецЕсли;
    
                // подсчёт процента за Год и проверка на пустоту Плана и Факта
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланГод) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактГод)  Тогда
                    ПроцентЗаГод = ОбластьОсновного.Параметры.ФактГод/ОбластьОсновного.Параметры.ПланГод*100;
                    ОбластьОсновного.Параметры.ПроцентГод = Формат(ПроцентЗаГод,"ЧДЦ=2");
                Иначе
                    ОбластьОсновного.Параметры.ПроцентГод = " ";
                КонецЕсли;
            
    //Продолжить;
            КонецЦикла;

Форум консультаций по прикладным решениям и программам фирмы «1С».

Онлайн консультации, вопросы и ответы, бесплатная регистрация, личная страница, twitter и facebook каналы и многое другое ждут Вас здесь.

Зарегистрироваться ← Ваш выбор → Войти на форум

  1. Платформа 8.3 Бухгалтерия 3.0 (3.0.37.37) . Надо найти Номенклатуру по реквизиту «Артикул»
    Команда Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,Артикул) — резульпат пустая ссылка. Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,»11108″) — находит. В Артакул строка «11108». Делаю поиск запросом — результат тот же. Помогите!!

  2. Реклама на форуме

    Чтобы убрать:

  3. Попробуйте так
    Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,СокрЛП(Артикул))
    Запрос то находит? Или тоже дает пустую ссылку?

  4. СокЛП пробывал и запросом тоже. Поиск на сервере. 1С:Предприятие 8.3 (8.3.5.138)

  5. Код в студию, плюс скриншот справочника и отладчика решил бы ситуацию.

  6. Согласен, код в студию….
    Имхо, на момент поиска в переменной Артикул, что-то иное, но только не искомый артикул.

  7. &НаКлиенте
    Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    Товар= ПоискПоАртикулю(Номенклатур);
    КонецПроцедуры

    &НаСервере
    Функция ПоискПоАртикулю(Номенклатур)

    Запрос = Новый Запрос;
    Запрос.Текст =
    «ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Артикул = &Артикул»;

    Запрос.УстановитьПараметр(«Артикул»,Номенклатур); //См здесь
    РезультатЗапроса = Запрос.Выполнить();

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи;
    Иначе
    Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
    КонецЕсли;

    Возврат 0;
    КонецФункции
    В отладчеке
    Выдаёт Ссылка Ошибка чтения значения
    Номенклатур «11 016» Строка

    а если конкретно указать артикул т.е

    &НаСервере
    Функция ПоискПоАртикулю(Номенклатур)

    Запрос = Новый Запрос;
    Запрос.Текст =
    «ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Артикул = &Артикул»;
    Запрос.УстановитьПараметр(«Артикул», «11016»); //См здесь
    РезультатЗапроса = Запрос.Выполнить();

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи;
    Иначе
    Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
    КонецЕсли;

    Возврат 0;
    КонецФункции
    В отладчике
    ВыборкаДетальныеЗаписи.Ссылка 11016 Пружина подвески СправочникСсылка.Номенклатура
    т.е всё ищет

    А теперь возможно ключ к развязке. на сервере присвою полю код.
    &НаСервере
    Функция ПоискПоАртикулю(Номенклатур)

    Запрос = Новый Запрос;
    Запрос.Текст =
    «ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Артикул = &Артикул»;
    Номенклатур=»11016″; // Возможно отгадка

    Запрос.УстановитьПараметр(«Артикул»,Номенклатур); //См здесь //См здесь
    РезультатЗапроса = Запрос.Выполнить();

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи;
    Иначе
    Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
    КонецЕсли;

    Возврат 0;
    КонецФункции

    Всё ок
    В отладчике
    ВыборкаДетальныеЗаписи.Ссылка 11016 Пружина подвески СправочникСсылка.Номенклатура

    Вывод: Дело где-то в передаче данных ч Клиента на Сервер.
    Может кто даст ссылку где прочесть про этот механизм.

  8. Да СокрЛП(Номенклатур) ставил.

  9. Вот тут
    &НаКлиенте
    …..
    Товар = ПоискПоАртикулю(Номенклатур)

    Номенклатур — какое значение?

  10. Реклама на форуме

    Чтобы убрать:

  11. Немного повангую.
    Вы открываете некий файл XLS, в котором есть некий перечень номенклатуры с артикулами. Парсите файл и из какой-то колонки дергаете ЧИСЛОВОЕ значение артикула, по которому и ищите номенклатуру. Но тут есть нюанс, в 1С по умолчанию разделитель триад (групп разрядов) числа — неразрывный пробел, что приводит к тому что число «10999» в строку транслируется как «10 999». Используйте функцию СтрЗаменить(ИсходнаяСтрока, Символы.НПП, «»)

  12. Андрей Вы телепат! Но дело в том что Это поле не числовое, а символьное и в нем пробелов не видно. Всё равно спасибо. попробую Используйте функцию СтрЗаменить(ИсходнаяСтрока, Символы.НПП.

  13. Загвоздка в том что там только числовые символы, и 1С, скорее всего, интерпретирует значение как число. Как вариант при загрузке значения из данной строки явно идентифицируйте его как строку, через «Строка()». Либо, если данные сначала загружаются в таблицу значений то у соответствующей колонки явно установите строковый тип.

  14. Спасибо Андрей. Всё получилось. Сделал как Вы советовали — поставил СтрЗаменить(ИсходнаяСтрока, Символы.НПП,»»)
    Резюме:
    Очевидно При чтении из Эксель поле с типом»символьное, где все символы числа 1С вставляет пробелы которые невидны. Решение при чтении из Экселя символьных полей всегда вставляйте «СтрЗаменить(ИсходнаяСтрока, Символы.НПП,»»)»

Похожие темы

Почему-то не задействована часть кода, (как узнал, через отладчик) Код Обрывается на

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Вот код, эта часть кода находится в самом конце
введите сюда описание изображения

Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

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

    // регистр Продажи 
    Движения.Продажи.Записывать = Истина;
    Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Клиент = Клиент;
        Движение.Номенклатура = ТекСтрокаТовары.Товар;
        Движение.Количество = ТекСтрокаТовары.Количество;
        Движение.Сумма = ТекСтрокаТовары.Сумма;
    КонецЦикла;

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

    Движения.Записать();

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

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

    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Отказ = Истина;

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

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

    Движения.СебестоимостьТоваров.Записывать = Истина;


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

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

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

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

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

        Движение = Движения.СебестоимостьТоваров.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;

        СтрокаТЧ = Товары.Найти(ВыборкаДетальныеЗаписи.Номенклатура, "Товар");

        Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Количество = СтрокаТЧ.Количество;
        Движение.Сумма = СебестоимостьЕдиницы * СтрокаТЧ.Количество;
    КонецЦикла;


КонецЕсли;

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

Доброго времени суток, коллеги! Много раз на нашем сайте обсуждалась тема запросов в 1С, например, как получить всех родителей элемента справочника одним запросом. В этой статье вы увидите еще много разных примеров запросов, которые помогут вам решать повседневные задачи. Вот, посмотрите.

Содержание

  1. Как в запросе 1с8 установить условие проверки периода на конец дня?
  2. Как правильно обрабатывать значения NULL в запросе 1С8?
  3. Как вывести результат запроса в табличный документ?
  4. Как посчитать возраст по дате рождения в запросе 1С8?
  5. Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
  6. Как запросом получить все подчиненные документы?
  7. Как выглядит недокументированный синтаксис оператора ВЫБОР?
  8. Как составить запрос к табличной части документа?
  9. Как запросом для документа найти все подчинённые ему документы?
  10. Как сравнить строки в запросе?
  11. Как в запросе проверить поле на пустую ссылку?
  12. Как в запросе убрать фильтр на значение параметра?

Как в запросе 1с8 установить условие проверки периода на конец дня?

В запросе воспользуемся функцией КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ), она приведет дату к виду «23:59:59».

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

Как правильно обрабатывать значения NULL в запросе 1С8?

В запросе значения типа NULL образуются в результате соединений (ЛЕВОЕ, ПРАВОЕ), когда элементу из одной таблицы по условию не находится соответствующего элемента из другой. Значение типа NULL имею специфические особенности:

    • Cравнение значения NULL с любым другим аргументом всегда возвращает ложь. Например, если в запросе поле «Количество» возвращает NULL, то если использовать операции сравнения «<», «>», или «=» с числом 1000, то результатом всегда будет «Ложь». Даже, если сравнить с самим значением NULL, то все равно результатом будет «Ложь»:
ГДЕ
	ГТД.Количество = NULL
    • Применение арифметических операций к значению типа NULL всегда возвращает NULL. Например, если в запросе к полю «Количество», которое возвращает NULL, прибавить числовое значение или отнять от него числовое значение, то будет возвращено значение NULL:
	ГТД.Количество+300 КАК Поле1
    • Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
      ГДЕ
      	ГТД.Регистратор.Организация IS NULL
      

      если нужно получить записи без NULL, тогда:

      ГДЕ
      	НЕ ГТД.Регистратор.Организация IS NULL
      
    • Для преобразования типа NULL используется функция «isNULL» или «ЕСТЬNULL». Теперь можно сравнивать с полученным значением или применять к нему арифметические операции, не боясь за конечный результат:
	ЕСТЬNULL(ГТД.Количество, 0)+300 КАК Поле1
    • Для того, чтобы в результате запроса отсечь записи, содержащие значения NULL применяются следующие конструкции: «IS NOT NULL», «NOT <поле> is NULL»:
ГДЕ
	ГТД.Регистратор.Организация IS NOT NULL

или

ГДЕ
	NOT ГТД.Регистратор.Организация IS NULL

Как вывести результат запроса в табличный документ?

Для этого можно использовать объект ПостроительОтчета:

ТабДок = Новый ТабличныйДокумент;
Результат = РезультатЗапроса.Выгрузить();

Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Результат);
Построитель.Вывести(ТабДок);

ТабДок.Записать("D:mxlТаблица.mxl");

Как посчитать возраст по дате рождения в запросе 1С8?

Использовать функцию языка запроса РАЗНОСТЬДАТ:

ВЫБРАТЬ
	Сотрудники.Сотрудник,
	Сотрудники.Пол,
	РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ТекДата, ГОД) КАК Возраст
ИЗ
	Сотрудники КАК Сотрудники
		ПОЛНОЕ СОЕДИНЕНИЕ ПриемНаРаботу КАК ПриемНаРаботу
		ПО Сотрудники.Сотрудник = ПриемНаРаботу.Сотрудник
		ПОЛНОЕ СОЕДИНЕНИЕ Пенсия КАК Пенсия
		ПО Сотрудники.Сотрудник = Пенсия.Сотрудник

Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?

Бывает, что в консоли запрос отрабатывается нормально, но в рабочем режиме падает с ошибкой «Значение не является значением объектного типа (Сумма)». При этом отладчик показывает, что в коллекции «ВыборкаИзРезультатаЗапроса» находиться сумма со значением «Ошибка чтения значения». При отладке выдается «Ошибка чтения значения», если в функции написать так:

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

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

Если Выборка.Следующий() Тогда
   ДоговорКонтрагента = Выборка.Наименование;
КонецЕсли;

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

С помощью Функции «ПолучитьСписокВводимыхДокументовНаОсновании» получим список документов, которые вводятся на основании заданного документа:

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

Теперь, на основании списка документов найдем все подчинённые заданному документу:

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

Выведем полученные документы:

Процедура ВывестиПодчиненныеДокументы()
	Массив = ПолучитьПодчиненныеДокументы();
	Для каждого Эл Из Массив Цикл
		Сообщить(Эл);
	КонецЦикла;
КонецПроцедуры

Как выглядит недокументированный синтаксис оператора ВЫБОР?

Вот нестандартный вариант синтаксиса оператора ВЫБОР:

	ВЫБРАТЬ
	ВЫБОР ДЕНЬНЕДЕЛИ(ДАТАВРЕМЯ(2015, 4, 1))
		КОГДА 1
			ТОГДА "Понедельник"
		КОГДА 2
			ТОГДА "Вторник"
		КОГДА 3
			ТОГДА "Среда"
		КОГДА 4
			ТОГДА "Четверг"
		КОГДА 5
			ТОГДА "Пятница"
		КОГДА 6
			ТОГДА "Суббота"
		ИНАЧЕ "Воскресенье"
	КОНЕЦ КАК ДеньНедели

В этом примере показано, как с помощью опрератора ВЫБОР выводить текстовое представление дня недели.

Как составить запрос к табличной части документа?

Пример запроса:

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

Особенность этого запроса в том, что мы обращаемся к табличной части «Товары». Поэтому к реквизитам документа «ЧекККМ» мы обращаемся через свойство «Ссылка». Только в этом случае мы сможем получить строки табличной части документа. Если не указать свойство «Ссылка», то появится ошибка, примерно такого вида:

{(7, 5)}: Поле не найдено «Документ.ЧекККМ.Дата»

Как запросом для документа найти все подчинённые ему документы?

Воспользуемся следующим запросом:

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	СчетФактураВыданный.Ссылка
|ИЗ
|	Документ.СчетФактураВыданный КАК СчетФактураВыданный
|ГДЕ
|	СчетФактураВыданный.ДокументОснование = &ДокументОснование";

Запрос.УстановитьПараметр("ДокументОснование",	Накладная);
РезультатЗапроса = Запрос.Выполнить();

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

Пока Выборка.Следующий() Цикл
	СФ = Выборка.Ссылка.ПолучитьОбъект();
	СФ.ДокументОснование = "";
	СФ.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;

Как сравнить строки в запросе?

|  ГДЕ  (Номер ПОДОБНО &НомерНакладной)
Запрос.УстановитьПараметр("НомерНакладной", "%"+НомерНакладной+"%");

Как в запросе проверить поле на пустую ссылку?

ВЫБРАТЬ
	Начисление.Ссылка,
	Увольнение.Ссылка КАК Ссылка1,
	Начисление.ДокументОснование,
	Увольнение.ДокументОснование КАК ДокументОснование1
ИЗ
	Документ.НачислениеЗарплатыРаботникамОрганизаций КАК Начисление
	СОЕДИНЕНИЕ
	Документ.УвольнениеИзОрганизаций КАК Увольнение
ПО
Начисление.ДокументОснование = Увольнение.ДокументОснование
ГДЕ
(Начисление.ДокументОснование<>
ЗНАЧЕНИЕ(Документ.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка))

Заметим, что в параметре пишем «Документ», а не «Документы» и «ПустаяСсылка» без скобок.

Как в запросе убрать фильтр на значение параметра?

Например, нам нужно вывести данные о продажах, отфильтровав их по значению в поле формы «Товар», если в этом поле выбран нужный нам товар. И если товар не выбран, то вывести данные по всем товарам. Пример запроса такой:

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

Запрос.Текст =
"ВЫБРАТЬ
|	ПродажиОбороты.Номенклатура,
|	ПродажиОбороты.СуммаОборот КАК Сумма
|ИЗ
|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
|	&ДатаОкончания, , 
|	&Товар) КАК ПродажиОбороты";

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запрос.УстановитьПараметр("Товар", Товар);

Рассмотрим четыре способа, как избавится от фильтра в запросе.

  1. Изменим параметр запроса с помощью функции «СтрЗаменить»:
    Если Товар.Пустая() Тогда
    	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "");
    Иначе
    	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "Номенклатура = &Товар");
    КонецЕсли;
    
  2. В параметре виртуальной таблицы вместо значения «&Товар» запишем следующее выражение:
    |&Товар = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) 
    | ИЛИ Номенклатура = &Товар
    

    Если параметр товар не заполнен, то первое выражение примет значение ИСТИНА, тогда значение всего выражения примет значение ИСТИНА. В этом случае как-будто и нет никакого фильтра. Но если товар заполнен, то первое выражение принимает значение ЛОЖЬ. Тогда сработает второе выражение и произойдет фильтрация по товару.

  3. Еще один способ возможен благодаря новому объекту платформы «СхемаЗапроса (QuerySchema)», который появился в версии 1С 8.3.5:
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
    Если ЗначениеЗаполнено(Товар) Тогда
    	СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.Параметры[3].Выражение = 
    	Новый ВыражениеСхемыЗапроса("Номенклатура = &Товар");
    КонецЕсли;
    Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
    
  4. Последний способ очень громоздкий, но его тоже можно использовать:
    Если Товар.Пустая() Тогда
    	Запрос.Текст =
    	"ВЫБРАТЬ
    	|	ПродажиОбороты.Номенклатура,
    	|	ПродажиОбороты.СуммаОборот КАК Сумма
    	|ИЗ
    	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
    	|	&ДатаОкончания, , ) КАК ПродажиОбороты"
    Иначе
    	Запрос.Текст =
    	"ВЫБРАТЬ
    	|	ПродажиОбороты.Номенклатура,
    	|	ПродажиОбороты.СуммаОборот КАК Сумма
    	|ИЗ
    	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
    	|	&ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты";
    КонецЕсли;
    

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

ПОДПИСКА

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • 1с во время получения обновления программы доступа произошла ошибка код ошибки 5
  • 1с внутренняя ошибка подсистемы контроля несогласованных изменений 1с