Форум программистов, компьютерный форум, киберфорум
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Заблокирован
1C 8.x

Необходимо высказать мнение о коде

29.01.2016, 17:42. Показов 2455. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет,
имеется код, довольно старый, но я в нем ошибок все - таки грубых не вижу.
показал в качестве примера своего кода, мне сказали - "вы не шарите".
почему не объяснили.
я вот сижу и смотрю на этот код и не могу понять че не так.
буду благодарен любой критике конструктивной.
кому не западло позырьте
код приложен
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
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
// СМЫСЛ ПРИ ПОЛУЧЕНИИ ДАННЫХ ВЫБИРАЕМ СВОБОДНЫЕ ДАННЫЕ
//ЧИТАЕМ ИХ К СЕБЕ, СТАВИМ НА НИХ ПОМЕТКУ ЗАХВАТА В РЕГИСТРЕ
//МЕНЯЕМ КАК-ТО ДАННЫЕ.тЕ ДАННЫЕ КОТОРЫЕ БЫЛИ В РЕГИСТРЕ И ПОМЕЧЕНЫ ЗАТИРАЕМ И ПОМЕЩАЕМ СВОИ ДАННЫЕ ЛИБО ЧЕРЕЗ 1 НАБОР 
// ЛИБО ЧЕРЕЗ НЕСКОЛЬКО 
 
&НаКлиенте
Процедура Вернуть(Команда)
    
    Если ВернутьНаСервере() Тогда
        ОповеститьОбИзменении(Тип("РегистрСведенийКлючЗаписи.РегистрЛогистики"));
    КонецЕсли;
    
КонецПроцедуры
 
&НаСервере
Функция ВернутьНаСервере()
      // читаем отборы по первоначальному отбору + по пользователю
    НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    // тут бд не нужна как бы
    Набор = РеквизитФормыВЗначение("НаборЗаписей");
    
    НаборКоторыйВРегистре = РегистрыСведений.РегистрЛогистики.СоздатьНаборЗаписей();
    НаборКоторыйВРегистре.Отбор.Склад.Установить(СкладДляОтбора);
    НаборКоторыйВРегистре.Отбор.ЗахваченоПользователем.Установить(ТекПользователь);
    НаборКоторыйВРегистре.Прочитать();
    НаборКоторыйВРегистре.Очистить(); 
    НаборКоторыйВРегистре.Записать(Истина); // очистил регистр
    
    НовыйНабор = РегистрыСведений.РегистрЛогистики.СоздатьНаборЗаписей();
    НовыйНабор.Отбор.Склад.Установить(СкладДляОтбора);
    НовыйНабор.Прочитать();
    
    Для Каждого ЭлементКоллекции Из Набор Цикл
        Нстр = НовыйНабор.Добавить();
        ЗаполнитьЗначенияСвойств(Нстр, ЭлементКоллекции, , "ЗахваченоПользователем");
    КонецЦикла;
    
    Набор.очистить();
    ЗначениеВРеквизитФормы(Набор,"НаборЗаписей");
    
    НовыйНабор.записать(Истина);
    
    Если ТранзакцияАктивна() Тогда
        Элементы.ФормаВернуть.Доступность = Ложь;
        Элементы.Прочитать.Доступность = Истина;
        ЗафиксироватьТранзакцию();
        Возврат Истина;
    КонецЕсли;
    
    Возврат Ложь;
    
КонецФункции
// сначала просто читаем, и пишем переписываем записи
// если не получилось, или получилось то перечитываем 
 
&НаКлиенте
Процедура Прочитать(Команда)
    
    Если ПрочитатьНаСервере() Тогда
        ОповеститьОбИзменении(Тип("РегистрСведенийКлючЗаписи.РегистрЛогистики"));
    Иначе 
        Сообщить("Чтение не удалось или данные заблокированы другим пользователем.");
    КонецЕсли;
    
КонецПроцедуры
 
&НаСервере
Функция ПрочитатьНаСервере()
    
    НачатьТранзакцию();
    ТекПользователь = ПараметрыСеанса.ТекущийПользователь;
    Если Не ЗначениеЗаполнено(ТекПользователь) Тогда
        ОтменитьТранзакцию();
        Возврат Ложь;
    КонецЕсли;
    
    НоваяСтруктура = Новый Структура;
    НоваяСтруктура.Вставить("Склад", СкладДляОтбора);
    //Выборка = РегистрыСведений.РегистрЛогистики.Выбрать(НоваяСтруктура);
    
    Набор = РегистрыСведений.РегистрЛогистики.СоздатьНаборЗаписей();
    Набор.Отбор.склад.установить(СкладДляОтбора);
    Набор.Отбор.ЗахваченоПользователем.Установить(Справочники.Пользователи.ПустаяСсылка());
    Набор.Прочитать();
    
    Если Набор.Количество()= 0 Тогда
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        Возврат Ложь;
    КонецЕсли;
    
    //Пока Выборка.Следующий() Цикл
    //  ЗаполнитьЗначенияСвойств(Набор.Добавить(), Выборка);
    //КонецЦикла;
    Набор2 = РегистрыСведений.РегистрЛогистики.СоздатьНаборЗаписей();
    Набор2.Отбор.склад.установить(СкладДляОтбора);
    Набор2.Отбор.ЗахваченоПользователем.Установить(ТекПользователь);
    Набор2.Прочитать();
    
    Для Каждого ЭлементКоллекции Из Набор Цикл
        Нстр = Набор2.Добавить();
        ЗаполнитьЗначенияСвойств(Нстр, ЭлементКоллекции); 
        Нстр.ЗахваченоПользователем = ТекПользователь; 
        Нстр.ПоследнийПользователь = ТекПользователь;   
    КонецЦикла;
    Набор.Очистить();
    Набор.Записать(Истина);
    
    Набор2.Записать();
    
    ЗначениеВРеквизитФормы(Набор2,"НаборЗаписей");
    
    Если ТранзакцияАктивна() Тогда
        Элементы.ФормаВернуть.Доступность = Истина;
        Элементы.Прочитать.Доступность = Ложь;
        ЗафиксироватьТранзакцию();
        Возврат Истина;
    КонецЕсли;
    
    Возврат Ложь;
    
КонецФункции
 
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ТекПользователь = ПараметрыСеанса.ТекущийПользователь;
КонецПроцедуры
 
&НаКлиенте
Процедура НаборЗаписейПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
    
    Отказ = Истина;
    Нстр = НаборЗаписей.Добавить();
    Нстр.ЗахваченоПользователем = ТекПользователь;
    Нстр.ПоследнийПользователь = ТекПользователь;
    //Нстр.Склад = СкладДляОтбора;
    
КонецПроцедуры
 
&НаКлиенте
Процедура ПриЗакрытии()
    ВернутьНаСервере();
    ОповеститьОбИзменении(Тип("РегистрСведенийКлючЗаписи.РегистрЛогистики"));
КонецПроцедуры
 
 
///почснение.
//карочи можно сделать что бы менялись отборы и прочее. набор выгрузить в таблицы и свернуть из по измерениям.
//и для каждой строки свой набор записей с отбором
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2016, 17:42
Ответы с готовыми решениями:

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

Просьба высказать свое мнение
Сайт www.vash-urist.spb.ru Внимание вопрос: можно ли сказать что он оптимизирован? Если нет, в чем же недочеты? С уважением

ПК для друга за 30т. +/-5т.Прошу взглянуть и высказать своё мнение
Друг попросил помощи в подборе стационарного ПК (сейчас у него ноутбук). Озвученные хотелки: 1. Лимит 30 000р. + /- 5000р. 2. Тихий,...

40
Заблокирован
04.02.2016, 11:30  [ТС]
Студворк — интернет-сервис помощи студентам
Блин, Денис, либо я дурак либо ты не верно понял.
приведенные последние образцы кода в процедурах "какбыпрочитать..." и "вернуть..."
они существуют вместе.
одной данные как бы читаются и не только,
а вторая возвращает данные и ничего вообще не читает на форму.
и в каждой из них нужны транзакции и желательно с блокировками исключительными, как ты сам и писал.
Вот про правки Волли на тему лишние две строчки - это збс.
я не знал, подозревал , но не юзал.
/////
так вот получается то что код особо и не изменился.
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.02.2016, 11:30
Gokusa, а правильно - собрать готовую ТЗ и один раз ее записать в регистр
0
Заблокирован
04.02.2016, 11:32  [ТС]
Цитата Сообщение от Dethmontt Посмотреть сообщение
а правильно - собрать готовую ТЗ и один раз ее записать в регистр
100%
ща вспомню че там было
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.02.2016, 11:32
Gokusa, честно! У тебя такая мутатень написана, что я читаю и ничего не понимаю.....
0
Заблокирован
04.02.2016, 11:36  [ТС]
а как я могу записать одну таблицу если я ее собираю из данных двух наборов с разными отборами.
и даже основные "рабочие" поля отбора, в данном случае - это склад, я не могу использовать, потому как многопользователский вариант.
////////
вооо, именно использовать одну таблицу.
я этого не смог сделать.
это вообще возможно в "текущих" описанных выше условиях?

Добавлено через 2 минуты
Цитата Сообщение от Dethmontt Посмотреть сообщение
У тебя такая мутатень написана, что я читаю и ничего не понимаю.....
Ну не только ты, руководитель проекта прежний тоже ничего не понял
з.ы.
вопрос, это совершенно верно что нужно одной таблицей записать.
а как можно запихать в один набор записей регистра данные из наборов с разными отборами.
при том что помимо наших данных могут быть параллельные "данные"?
я не смог придумать как это запихать туда.
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.02.2016, 11:41
Gokusa, какой смысл то несет этот регистр логистики?
0
Заблокирован
04.02.2016, 11:47  [ТС]
ну просто актуальные и не очень данные.
пользователь меняет прям данные регистра напрямую.
регистрэтот - это основные рабочие данные.
раньше был ексель, стал регистр.

Добавлено через 3 минуты
Цитата Сообщение от Gokusa Посмотреть сообщение
я не смог придумать как это запихать туда.
если только с реквизитами и измерениями поиграться.
Вопрос:
получится ли прирост производительности какой-нибудь если пошаманить с измерениями и реквизитами записей регистра, работа с которыми строится по схеме из двух предоставленных процедур, чтобы добиться таки записи одной таблицы в набор.
стоит ли овчинка выделки?
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.02.2016, 11:48
Цитата Сообщение от Gokusa Посмотреть сообщение
Набор = РеквизитФормыВЗначение("НаборЗаписей");
А это что? поле на форме с типом НаборЗаписей? Какой отбор?
0
Заблокирован
04.02.2016, 11:49  [ТС]
Цитата Сообщение от Dethmontt Посмотреть сообщение
А это что? поле на форме с типом НаборЗаписей? Какой отбор?
это таблица формы вроде вместо поля,и тип данные формы структура с коллекцией.
отбор по умолчанию никакой.
но потом при прочтении ставится по складу и Текущемупользователю.
последний пользователь - реквизит записи
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.02.2016, 11:52
Gokusa, возьми вон wwall себе репетитором по Русскому языку (ЕСЛИ ДОГОВОРИШЬСЯ) заодно он тебе поможет и 1С подтянуть =))))
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
04.02.2016, 11:54
Цитата Сообщение от Gokusa Посмотреть сообщение
Набор = РегистрыСведений.РегистрЛогистики.Создат ьНаборЗаписей(); Набор.Отбор.склад.установить(СкладДляОтб ора); Набор.Отбор.ЗахваченоПользователем.Устан овить(Справочники.Пользователи.ПустаяСсы лка()); Набор.Прочитать(); Если Набор.Количество()= 0 Тогда Возврат Ложь; КонецЕсли;
Вместо этого - запрос и его проверка на пустоту. И очистку после добавления перенести.
0
Заблокирован
04.02.2016, 12:03  [ТС]
Цитата Сообщение от wwall Посмотреть сообщение
Вместо этого - запрос и его проверка на пустоту. И очистку после добавления перенести.
вопрос:
вт написал я
1C
1
2
3
4
5
6
7
8
з = новый запрос(выбрать * из регистрсведений.регситрлогистики рс где рс.пользователь = &п);
з.установиттьпараметр("п", справочник.польз.пустаяссылка);
р = з.выполнить();
если р.пустой() тогда 
возврат;
конецесли;
////
тратата перенос.
и вопрос????
чтобы затереть прочитанный набор, мне что нужно будет опять создать набор, установить отбор, и записатьего?
или по другому как то можно записать в рег сведений?
в чем тогда выигрыш, если все равно приходится читать объектой моделью, да плюс еще и запросной?

Добавлено через 2 минуты
з.ы. Волли, а ты специально сидел, потел, переносы строк убирал из цитаты ?
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
04.02.2016, 12:04
Его тебе нужно будет создать когда записи есть. Если записей нет - не надо ничего создавать. Запрос - это более быстрая версия твоего прочитать. Нет обвязки на создание внутренних структур.
и правильнее будет "ВЫБРАТЬ ПЕРВЫЕ 1 а.Пользователи" - уменьшая объемы выборок - тебе за это база данных спасибо скажет.

Добавлено через 37 секунд
Цитата Сообщение от Gokusa Посмотреть сообщение
з.ы. Волли, а ты специально сидел, потел, переносы строк убирал из цитаты ?
Ага... Другой работы же нет. Дай думаю переносы уберу
0
Заблокирован
04.02.2016, 12:07  [ТС]
Цитата Сообщение от wwall Посмотреть сообщение
"ВЫБРАТЬ ПЕРВЫЕ 1 а.Пользователи"
почему выбрать первые 1 ?
хотя это не суть важно.
Я тебя понял про запрос.
а если учесть что ситуация когда результат пустой она один раз из 1000 будет, я думаю уже не имеетс смысл писать пред проверку запросом.
это верно?
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
04.02.2016, 12:24
Цитата Сообщение от Gokusa Посмотреть сообщение
почему выбрать первые 1 ?
ПОтому что если твоему условию удовлетворяет миллион строк - будет выбрана все равно 1. Плюс для скульного оптимизатора это тоже помощь.
Цитата Сообщение от Gokusa Посмотреть сообщение
а если учесть что ситуация когда результат пустой она один раз из 1000 будет, я думаю уже не имеетс смысл писать пред проверку запросом.
это верно?
Смотри - у тебя N записей в регистре. Если ты себе можешь позволить каждый раз тратить время на выделение памяти, получение данных из БД и анализ - вместо того что бы провести просто анализ - то да. Можно и без запроса. Дело в том что .Прочитать() никак не ограничивает выборку. А в запросе ты можешь ее ограничить.
0
Заблокирован
04.02.2016, 12:27  [ТС]
ок.
я понял.
збс.
спс.
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
04.02.2016, 12:35
Вот смотри - тебе нужно от твоего набора всего два действия - сказать пустой он или нет, и очистить его.
То есть читать его - не надо. Самый простой вариант твоего кода выглядит так

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

Добавлено через 2 минуты
Текст запроса примерно такой -
выбрать * из выбрать первые 1 рс.пользователь из регистрсведений.регситрлогистики рс где рс.пользователь = &п

Добавлено через 1 минуту
и тогда будет достаточно возврат Запрос.Выполнить().Пустой(), имя дашь НетЗаписейВРегистре()
и код поменять на
Если НетЗаписейВРегистре() тогда
возврат ложь;
конецесли;
а то много "не" тоже плохо читается
0
Заблокирован
04.02.2016, 12:37  [ТС]
Волли, дочитываем !!!!
1C
1
2
3
4
5
6
7
  //дочитывем 
    Для Каждого ЭлементКоллекции Из Набор Цикл   
        Нстр = Набор2.Добавить();
        ЗаполнитьЗначенияСвойств(Нстр, ЭлементКоллекции); 
        Нстр.ЗахваченоПользователем = ТекПользователь;  
        Нстр.ПоследнийПользователь = ТекПользователь;   
    КонецЦикла;
набор - это именно тот самый набор.
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
04.02.2016, 13:03
В таком случае читать надо.

Добавлено через 11 секунд
Согласен
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.02.2016, 13:17
Gokusa, Я вообще эту архитектуру понять не могу, ну хоть убейте меня

Добавлено через 1 минуту
из кода Gokusa, я понял что с 1 складом может работать только 1 пользователь (одновременно) т.к. чтение происходит по пустому пользователю и по текущему по одному складу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2016, 13:17

Необходимо мнение професионалов
Руководство поручило занятся работой по сайту, до этого сайтом занимались в филиале в другом городе. ТЗ:Сайт сделан на Wordpress. На всех...

Необходимо Ваше мнение
Здравствуйте. На данный момент изучаю C# и параллельно пишу для себя небольшую программу. Хотелось бы узнать ваше мнение касаемо...

Сайтостроители необходимо ваше мнение
Здравствуйте уважаемые форумчане! Заказал я у одного фрилансера сайт для развития оффлайн бизнеса => http://sz-energy.ru/ , отдал ему...

Сборка компьютера (необходимо ваше мнение)
1.Процессор AMD FX-6300 - 4 020 руб. 2.Материнская плата MSI 760GA-P43 - 2 530 руб. 3.Видеокарта GigaByte AMD Radeon R9 270X - 7 610...

Необходимо мнение знающих для сборки пк
Здорово всем.Решил сменить комп так как нынешний устарел как морально так и физически.В нашем крае нет особого выбора в плане...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru