@razor_ru
Системный администратор

Что не так в коде (1С)?

Всем привет! Сразу уточню такой момент -я новичок в программировании, да и в 1С- тоже. "Почему 1С?" - спросите вы? "Начни с питона!" - скажут другие. В 1С появились перспективы и я жадно изучаю все что с ним связано, на второй день залез уже не посредственно в более гибкую автоматизацию расчетов. Я хочу сделать авторасчет стажа сотрудника в формате (дд.ММ.гггг). По прошлым урока на Ютубе решил написать простой код, сколько радости было когда проверка модуля не выдала ошибок, но задуманное так и не исполнилось. Кто может подсказать где в коде ошибка?
5d10c6cb4b4ef320126064.png5d10c6d10a6c7987007774.png
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
@Dementor
программист, архитектор, аналитик
Что не правильно?
1) ПустаяСтрока() - функция для проверки строковой переменной на наличие значимых символов (пробелы, табуляции и прочие разделители игнорируются) - явно не преднозначено для проверки суммы итогового стажа, который будет преобразовываться к строке "0" и функция всегда будет давать результат Ложь. Если итоговый стаж - это не дни итогового стажа, а дата увольнения (с названиями вам еще работать и работать - сами себя путаете), то дата преобразовывается тоже к строковому литералу, который выдаст аналогичную Ложь. Потому содержимое внутри условия никогда не будет выполнено!

2) Обращения вида "Объект." ссылаются на реквизиты вашего документа, а не на реквизиты строк табличной части! Вам нужно сперва узнать значение текущей строки табличной части (под курсором) и дальше работать уже с этой строкой.

3) Что вы там пытались присвоить в двоичном формате непонятно, но явно не в тему.

4) Предположим, что вы своими ноликами-единичками хотели обнулить дату. Тогда согласно вашей формуле вы к пустой дате добавляете сумму количество секунд от даты приема с количества секунд от даты увольнения - это где-то 4036 год получится.

UPD. Дополнено после переписки в комментариях
1) Что должно быть в Итого? По идее количество месяцев! Тип "Строка" тут ни к чему - количество это всегда тип "Число".
2) На поле табличной части вам нужно добавить обработчик события ПриИзменении с примерно следующим содержимым:
&НаКлиенте
Процедура СтажРаботыПриИзменении(Элемент)
	
	РедактируемаяСтрока = Элементы.СтажРаботы.ТекущиеДанные;
	
	// строку могли удалить и в таблице ничего нет
	Если РедактируемаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	
	// обязательно делаем проверку данных!
	Если РедактируемаяСтрока.ДатаПриема >= РедактируемаяСтрока.ДатаУвольнения Тогда
		РедактируемаяСтрока.Итог = 0;
		Возврат;
	КонецЕсли; 
	
	// в зависимости от требуемого значения делаем расчет
	// еще важен способ округления - к меньшему целому или к большему
	ОтработаноСекунд = РедактируемаяСтрока.ДатаУвольнения - РедактируемаяСтрока.ДатаПриема;
	ОтработаноЧасов = ОтработаноСекунд / 60;
	ОтработаноДней = ОтработаноСекунд / 86400;
	
	// если нужно значение месяцев или лет, то используем сдвиги в цикле
	ОкруглятьКБольшему = Истина;  // 1 день сверху дасть дополнительный 1 месяц или 1 год
	
	ОтработаноМесяцев = ?(ОкруглятьКБольшему, 0, -1);
	СкользящийМесяц = РедактируемаяСтрока.ДатаПриема;
	Пока СкользящийМесяц < РедактируемаяСтрока.ДатаУвольнения Цикл
		ОтработаноМесяцев = ОтработаноМесяцев + 1;
		СкользящийМесяц = ДобавитьМесяц(СкользящийМесяц, 1);
	КонецЦикла;
	
	ОтработаноЛет = ?(ОкруглятьКБольшему, 0, -1);
	СкользящийГод = РедактируемаяСтрока.ДатаПриема;
	Пока СкользящийГод < РедактируемаяСтрока.ДатаУвольнения Цикл
		ОтработаноЛет = ОтработаноЛет + 1;
		СкользящийГод = ДобавитьМесяц(СкользящийГод, 12);
	КонецЦикла;
	
	// выводим значение на форму
	РедактируемаяСтрока.Итог = ОтработаноМесяцев;
	
КонецПроцедуры


Но я не умерен в том, что вам нужен реквизит стажа. Возможно было бы достаточно "виртуального реквизита" (добавленого в табличную часть на форме) действительно с типом Строки, куда при открытии и изменении выводить расчетные данные в виде "10 лет, 4 мес, 17 дней".
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Jump
@Jump
Системный администратор со стажем.
Да все так.
Что вам конкретно не нравится? Что не устраивает?
Вы присвоили в коде значение переменной - вроде без ошибок. В чем проблема то?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы